From 1fd14cf7d81d4c866f59dbe087e2d0f01446523b Mon Sep 17 00:00:00 2001 From: fujinliang Date: Fri, 16 Jan 2026 15:21:54 +0800 Subject: [PATCH] bgg35-50 --- COM/COM_Robot.py | 8 +- CU/Feed_save.py | 829 ---- CU/Feeding.py | 31 +- CU/Feeding_C.py | 474 --- CU/Feeding_old.py | 809 ---- CU/drop.py | 66 +- CU/list.ini | 5 - CU/sae.py | 843 ---- CU/save_feeding.py | 941 ----- CU/test_Catch_EMV.py | 34 - CU/test_Detect.py | 90 - Config/FeedLine.ini | 44 +- Config/drop.ini | 66 +- Constant.py | 3 +- EMV/EMV.py | 218 +- EMV/EMV_HC.py | 412 ++ EMV/EMV_old_save.py | 401 -- EMV/EMV_reneer_pengqi_save.py | 274 -- EMV/all_sensors_device_test.py | 39 +- EMV/only_sensor1_test.py | 28 - EMV/sensors_test.py | 88 - MainWin.ui | 6057 ---------------------------- MainWin_ui.py | 4066 ------------------- Mv3D/CameraUtil.py | 6 +- Mv3D/Mv3dRgbdImport/Mv3dRgbdApi.py | 3 +- Mv3D/calculate_diff2.py | 140 +- Mv3D/point.rknn | Bin 4525718 -> 4525846 bytes Seting.ini | 3 +- TEST3.py | 90 - Util/util_log.py | 37 +- app.py | 1045 ----- main.py | 276 +- test.py | 51 - test2.py | 54 - test6.py | 37 - test_ui.py | 39 - ui_MainWin - 副本 (2).py | 4889 ---------------------- ui_MainWin.py | 75 +- ui_untitled.py | 1422 ------- untitled.ui | 2918 -------------- workflow_test.py | 353 -- 41 files changed, 1133 insertions(+), 26131 deletions(-) delete mode 100644 CU/Feed_save.py delete mode 100644 CU/Feeding_C.py delete mode 100644 CU/Feeding_old.py delete mode 100644 CU/list.ini delete mode 100644 CU/sae.py delete mode 100644 CU/save_feeding.py delete mode 100644 CU/test_Catch_EMV.py delete mode 100644 CU/test_Detect.py create mode 100644 EMV/EMV_HC.py delete mode 100644 EMV/EMV_old_save.py delete mode 100644 EMV/EMV_reneer_pengqi_save.py delete mode 100644 EMV/only_sensor1_test.py delete mode 100644 EMV/sensors_test.py delete mode 100644 MainWin.ui delete mode 100644 MainWin_ui.py delete mode 100644 TEST3.py delete mode 100644 app.py delete mode 100644 test.py delete mode 100644 test2.py delete mode 100644 test6.py delete mode 100644 test_ui.py delete mode 100644 ui_MainWin - 副本 (2).py delete mode 100644 ui_untitled.py delete mode 100644 untitled.ui delete mode 100644 workflow_test.py diff --git a/COM/COM_Robot.py b/COM/COM_Robot.py index eb63de6..9ee31e2 100644 --- a/COM/COM_Robot.py +++ b/COM/COM_Robot.py @@ -1,9 +1,6 @@ import logging from enum import Enum from turtle import Turtle - -from numpy.array_api import trunc - import Constant from COM.COM_TCP import TCPClient import queue @@ -11,6 +8,7 @@ import json from Model.RobotModel import DataAddress, DATARequest, DATAReply, CMDInstructRequest, Instruction from Util.util_log import log from Util.util_math import is_bit_set +#from numpy.array_api import trunc class DetectType(Enum): @@ -45,9 +43,9 @@ class RobotClient(TCPClient): def send_Command(self): try: if self.command_quene.qsize()!=0: - log.log_message(logging.INFO, f'robot-command:从队列获取命令') + # log.log_message(logging.INFO, f'robot-command:从队列获取命令') command = self.command_quene.get() - log.log_message(logging.INFO, f'robot-command:{command}') + #log.log_message(logging.INFO, f'robot-command:{command}') self.client_socket.send(command.encode()) if True: response = self.client_socket.recv(1024).decode('utf-8') diff --git a/CU/Feed_save.py b/CU/Feed_save.py deleted file mode 100644 index f7adaf7..0000000 --- a/CU/Feed_save.py +++ /dev/null @@ -1,829 +0,0 @@ -import copy -import logging -import random -import threading -import time - -import cv2 -import numpy as np -from PyQt5.QtWidgets import QMessageBox -from PySide6.QtCore import Signal, QObject -from PySide6.QtGui import QPixmap - -import Constant -import Expection -from CU.Catch import Catch, CatchStatus -from CU.Detect import Detect, DetectStatus -from Model.FeedModel import PositionModel -from Model.Position import Real_Position, Detection_Position -from enum import Enum, IntEnum -from COM.COM_Robot import RobotClient, DetectType -from Model.RobotModel import CMDInstructRequest, MoveType -from Trace.handeye_calibration import getPosition -from Trace.handeye_calibration import getxyz,getxyz1 -from Util.util_math import get_distance -from Util.util_time import CRisOrFall -#from Vision.camera_coordinate_dete import Detection -from Util.util_log import log -from Model.RobotModel import Instruction -from EMV.EMV import RelayController -from CU.drop import DropPositionManager -class ResetStatus(Enum): - RNone = 0 - RStart = 1 - RRunging = 2 - ROk =3 - -class FeedStatus(IntEnum): - FNone = 0 - FStart = 1 - FCheck = 2 - FMid = 3 - FPhoto = 4 - FTake = 5 - FBroken1 = 6 - FBroken2 =7 - FShake = 8 - FDropBag = 9 - FFinished = 10 - FReverse = 11 - FStartReverse = 12 - -class LineType(Enum): - Straight = 0 - CureMid = 2 - CureEnd = 3 - WORLD = 4 - - -class FeedMidStatus(Enum): - FMid_Start = 1 - FMid_Take = 2 - FMid_Feed= 3 - -class FeedPosition: - def __init__(self,status:FeedStatus,position:Real_Position): - self.status = status - self.position = position - -class FeedLine: - def __init__(self, id, name, feed_positions:list): - self.feed_positions = copy.deepcopy(feed_positions) - self.feeding2end_pos_index = 0 - self.origin2start_pos_index = 0 - self.start2take_pos_index = 0 - self.name = name - self.id = id - - # --- 新增:用于存储从 ini 文件读取的多个投料点坐标 --- - # 这个列表将在加载 ini 时填充 [[x1,y1,z1,u1,v1,w1], [x2,y2,z2,u2,v2,w2], ...] - self.drop_point_list = [] - - def get_current_feed_position(self,is_reverse): - pos = self.feeding_to_end[ (self.feeding2end_pos_index+1)%len(self.feeding_to_end) if is_reverse else self.feeding2end_pos_index-1] - return pos - def get_current_take_position(self,is_reverse): - pos = self.start_to_take[ (self.start2take_pos_index+1)%len(self.start_to_take) if is_reverse else self.start2take_pos_index-1] - return pos - def get_current_start_position(self,is_reverse): - pos = self.origin_to_start[(self.origin2start_pos_index+1)%len(self.origin_to_start) if is_reverse else self.origin2start_pos_index-1] - return pos - - def get_next_feed_position(self,reverse:bool=False): - pos = self.feeding_to_end[self.feeding2end_pos_index] - if reverse: - self.feeding2end_pos_index -= 1 - if self.feeding2end_pos_index < 0: - self.feeding2end_pos_index = len(self.feeding_to_end) - 1 - else: - self.feeding2end_pos_index += 1 - if self.feeding2end_pos_index >= len(self.feeding_to_end): - self.feeding2end_pos_index = 0 - return pos - - def get_next_start_position(self,reverse:bool=False): - pos = self.origin_to_start[self.origin2start_pos_index] - if reverse: - self.origin2start_pos_index -= 1 - if self.origin2start_pos_index < 0: - self.origin2start_pos_index = len(self.origin_to_start) - 1 - else: - self.origin2start_pos_index += 1 - if self.origin2start_pos_index >= len(self.origin_to_start): - self.origin2start_pos_index = 0 - - return pos - - def get_next_take_position(self,reverse:bool=False): - pos = self.start_to_take[self.start2take_pos_index] - if reverse: - self.start2take_pos_index -= 1 - if self.start2take_pos_index < 0: - self.start2take_pos_index = len(self.start_to_take) - 1 - else: - self.start2take_pos_index += 1 - if self.start2take_pos_index >= len(self.start_to_take): - self.start2take_pos_index = 0 - return pos - def get_take_position(self): - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - return self.feeding_to_end[i] - - def set_take_position(self, position: Real_Position, dynamic_height=0): - """ - 设置 FTake 位置,并更新其前后动态点的位置。 - :param position: 新的抓取位置 - :param dynamic_height: 动态高度调整 (如果需要) - """ - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - # 计算 XYZ 坐标 - # xyz = getxyz(position.X, position.Y, position.Z, position.a, position.b, position.c) - xyz = getxyz1(position.X, position.Y, position.Z, position.a, position.b, position.c) - # 创建 before 和 after 位置 - befor_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - after_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - # 安全检查索引 - if i > 0: - self.feeding_to_end[i - 1].set_position(befor_take_position) - else: - print("Warning: No position before FTake to update.") - self.feeding_to_end[i].set_position(position) - if i + 1 < len(self.feeding_to_end): - self.feeding_to_end[i + 1].set_position(after_take_position) - else: - print("Warning: No position after FTake to update.") - break # 抓料点暂时就一个 - - def set_drop_position(self, position: Real_Position): - """ - 设置 FDropBag 位置,只设置当前点,不处理前后点。 - :param position: 新的丢包位置 - """ - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FDropBag.value: - # 直接设置当前点的位置 - self.feeding_to_end[i].set_position(position) - print( - f"✅ FDropBag 位置已更新: ({position.X}, {position.Y}, {position.Z}, {position.U}, {position.V}, {position.W})") - break # 假设只有一个丢包点 - - def get_position_list(self): - index_start = -1 - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FCheck.value: - index_start = i - break - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FPhoto.value: - index_take = i - - self.origin_to_start = self.feed_positions[: index_start+1] - self.start_to_take = self.feed_positions[index_start:index_take+1] - self.feeding_to_end = self.feed_positions[index_take:] - - for i in range(len(self.feeding_to_end)): #插入动态中间点 - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - befor_position_model = PositionModel() - befor_position_model.init_position(None) - after_position_model = PositionModel() - after_position_model.init_position(None) - - self.feeding_to_end.insert(i, befor_position_model) - self.feeding_to_end.insert(i+2, after_position_model) - break - -class FeedingConfig: - def __init__(self, num: int, feedLine: FeedLine, photo_locs): - self.num = num - self.feedLine = feedLine - self.photo_locs = [self.deal_photo_locs(p) for p in photo_locs] - - - def deal_photo_locs(self, photo_loc): - position_photo = Real_Position() - position_photo.init_position(photo_loc[0], photo_loc[1], photo_loc[2], photo_loc[3], photo_loc[4], photo_loc[5]) - return position_photo - - def get_line_info(self): - pass - - -class Feeding(QObject): - need_origin_signal = Signal(str) - take_no_photo_sigal = Signal() - update_detect_image = Signal(np.ndarray) - log_signal = Signal(int,str) - def __init__(self, robotClient: RobotClient): - super().__init__() - self.feedConfig = None - self.feedStatus = FeedStatus.FNone - self.robotClient = robotClient - # 添加 RelayController 实例 - self.relay_controller = RelayController() - self.sensor_thread = None - self.detection_image = None - self.init_detection_image() - self.pause = False - self.cRis_photo = CRisOrFall() - self.cRis_shake = CRisOrFall() - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.is_reverse = False - # 复位集合 - self.run_reverse = False - self.take_no_photo = False - self.reset_status = ResetStatus.RNone - self.reversed_positions = [] - self.current_position = None - self.index=1 - self.pos_index = -1 - self.pos_near_index = -1 - self.catch = Catch(self.robotClient) - self.detect = Detect() - self.is_detected = True - self.detect_thread = threading.Thread(target=self.run_detect) - self.detect_thread.start() - self.onekey = False - self.debug_run_count = 0 # 初始化计数器 - self.mid_take_count = 0 - #传感器判断抓包参数 - self.sensor2_ready = False # 传感器2是否检测到料包 - self.motor_stopped_by_sensor2 = False # 是否由传感器2触发停止电机 - self.sensor_thread = None - self.relay_controller = RelayController() - # 启动传感器2线程 - self.relay_controller._running = True - self.sensor2_thread = None - - # --- 新增: 用于码垛模式的投料点索引 --- - self.current_drop_index = 0 - self.drop_manager = DropPositionManager() - pass - - def close_feed(self): - self.is_detected = False - self.detect_thread.join() - self.detect.detection.release() - - def init_detection_image(self): - detection_image = cv2.imread(Constant.feed_sign_path) - self.update_detect_image.emit(detection_image) - - def run_detect(self): - while self.is_detected: - self.detect.run() - time.sleep(0.02) - - def run(self): - self.catch.run() - # 获取事件坐标 - real_position = Real_Position() - self.detect.position_index = 0 - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - # real_position.init_position(0, - # 0, - # 0, - # 0, - # 0, - # 0); - - # img_path = f'Image/{self.index}.png' - # img = cv2.imread(img_path) - # self.index += 1 - # self.index = self.index % 4 - # self.detection_image = img - - if self.feedConfig == None: - self.feedStatus = FeedStatus.FNone - - if self.feedConfig !=None and self.feedConfig.num == 0 and self.is_reverse and self.robotClient.origin_position.compare(real_position,is_action=True): - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - self.log_signal.emit(logging.INFO, Constant.str_feed_reverse) - - if self.feedStatus == FeedStatus.FNone or self.pause: - return - - elif self.feedStatus == FeedStatus.FCheck: - self.log_signal.emit(logging.INFO, Constant.str_feed_check) - # 1, 检查是否是三列 - # 2, 检查是否有人 - # if self.safe_check_columns() and self.safe_check_person(): - # pass - # else: - # if self.feedConfig.num != 0: - # self.next_target() - # if == 原点 继续判断 - # else: - # QMessageBox.information(None, "提示", Constant.str_feed_sae_error_msgbox) - - if self.is_reverse: - self.feed_Mid_Status = FeedMidStatus.FMid_Start - else: - self.feed_Mid_Status = FeedMidStatus.FMid_Take - - if self.feedConfig.feedLine.start_to_take[0].get_position().compare(real_position): - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FStart: - self.log_signal.emit(logging.INFO, Constant.str_feed_start) - self.relay_controller.open(conveyor2=True)#开电机 - #self.sensor2_thread = threading.Thread(target=self.relay_controller.handle_sensor2, daemon=True)#线程2的开始,但是在那里设置结束呢 - #self.sensor2_thread.start() - if not self.robotClient.origin_position.compare(real_position,is_action=True) and not self.is_reverse: - # QMessageBox.information(None, "提示", Constant.str_feed_start_error) # Fuck 引起异常 - self.log_signal.emit(logging.ERROR, Constant.str_feed_start_error) - self.need_origin_signal.emit(Constant.str_feed_start_error) - self.feedStatus = FeedStatus.FNone - return - if self.is_reverse: - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - return - - self.feedConfig.feedLine.get_position_list() - self.detect.detect_status = DetectStatus.DNone - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FMid: - feed_pos = self.get_current_position(self.is_reverse) - if feed_pos.get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_mid) - self.next_position(self.is_reverse) - # 增加计数器逻辑 - self.mid_take_count += 1 - # 可选:在 Debug1 模式下输出日志 - if Constant.Debug1: - self.log_signal.emit( - logging.INFO, - f"[调试计数] 已进入 FMid 分支 {self.mid_take_count} 次" - ) - #if self.feedStatus == FeedStatus.FTake: - #self.catch.catch_status = CatchStatus.CTake - - elif self.feedStatus == FeedStatus.FPhoto: - if self.feedConfig.num == 0: - self.log_signal.emit(logging.INFO, Constant.str_feed_finish) - self.is_reverse = True - self.feed_Mid_Status = FeedMidStatus.FMid_Take - self.feedConfig.feedLine.start2take_pos_index = len(self.feedConfig.feedLine.start_to_take) - 2 - self.feedConfig.feedLine.origin2start_pos_index = len(self.feedConfig.feedLine.origin_to_start) - 2 - self.next_position(self.is_reverse) - self.log_signal.emit(logging.INFO, Constant.str_feed_photo) - self.init_detection_image() - return - - if not Constant.Debug: - self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto) - self.feed_Mid_Status = FeedMidStatus.FMid_Feed - self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_success) - self.feedConfig.feedLine.set_take_position(self.detect.detect_position, 0) - #self.feedConfig.feedLine.set_take_position(real_position, 0)#必须设置 - '''real_position''' - # 一直等待传感器2信号,永不超时 - while True: - sensors = self.relay_controller.get_all_device_status('sensors') - sensor2_value = sensors.get(self.relay_controller.SENSOR2, False) - if sensor2_value: - self.log_signal.emit(logging.INFO, "✅ 传感器2检测到料包到位,开始执行抓取") - break # ✅ 条件满足,跳出循环,继续执行下面的代码 - else: - self.log_signal.emit(logging.INFO, "⏳ 等待传感器2料包信号...") - time.sleep(1) # 每秒检查一次 - self.next_position() - self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) - - #self.feedStatus = FeedStatus.FTake - - elif self.feedStatus == FeedStatus.FTake: - self.log_signal.emit(logging.INFO, Constant.str_feed_take) - take_position = self.feedConfig.feedLine.get_take_position() - if not take_position or not take_position.get_position(): - self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - return - if not take_position.get_position().compare(real_position, is_action=True): - self.log_signal.emit(logging.INFO, "🟡 机器人尚未到达抓料点位") - return - self.log_signal.emit(logging.INFO, "🟢 机器人已到达抓料点位") - # 执行抓取动作 - #self.catch.catch_status = CatchStatus.CTake - #if self.catch.catch_status == CatchStatus.CNone: - #self.catch.catch_status = CatchStatus.CTake - #if self.catch.catch_status == CatchStatus.CTake: - #self.log_signal.emit(logging.INFO, "正在执行抓料动作...") - #self.catch.catch_status = CatchStatus.COk - #if self.catch.catch_status == CatchStatus.COk: - #self.log_signal.emit(logging.INFO, Constant.str_feed_take_success) - #self.catch.catch_status = CatchStatus.CNone - # 移动到下一个抓取点 - # 更新丢包点: 如果需要根据放置情况调整下次抓取 - #next_drop_pos = self.drop_manager.get_next_drop_position(lineid=1) - #if next_drop_pos: - #self.feedConfig.feedLine.set_drop_position(next_drop_pos) - #self.log_signal.emit(logging.INFO, f"已设置放置点: X={next_drop_pos.X:.2f}") - #else: - #self.log_signal.emit(logging.ERROR, "获取放置点失败") - #return - self.feedConfig.feedLine.set_drop_position(real_position)#我想在这里读取我的一个ini文件值里面有很多个drop点,每一次索引递增的点 - self.relay_controller.open(clamp=True) - self.next_position() - #return - #else: - #self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - - elif self.feedStatus == FeedStatus.FBroken1: - - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - - elif self.feedStatus == FeedStatus.FBroken2: - - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - elif self.feedStatus == FeedStatus.FShake: - if self.get_current_position().get_position().compare(real_position,is_action=True): - # TODO 震动方案 - self.log_signal.emit(logging.INFO, Constant.str_feed_shake) - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CShake - return - if self.catch.catch_status == CatchStatus.CShake: - # if self.feedConfig.feedLine.feeding_to_end[ - # self.feedConfig.feedLine.feeding2end_pos_index + 1].status != FeedStatus.FShake: - # self.catch.catch_status = CatchStatus.COk - # else: - self.catch.shake_continue.SetReset() - self.next_position() - if self.feedStatus!=FeedStatus.FShake: - self.catch.catch_status = CatchStatus.CNone - return - - elif self.feedStatus == FeedStatus.FDropBag: - #"""*** 处理投料点 (FDropBag) 的核心逻辑 ***""" - # 1. 确认机械臂是否已精确到达当前目标投料点 - # get_current_position() 会根据 self.feed_Mid_Status (应为 FMid_Feed) - # 调用 feedLine.get_current_feed_position(),从 feeding_to_end 列表获取 - # 由 feeding2end_pos_index 指向的点。 - if self.get_current_position().get_position().compare(real_position, is_action=True): - # 2. 记录日志:已到达投料点 - if not self.sensor2_ready: - self.log_signal.emit(logging.INFO, "抓取完成,重新启动 conveyor2") - self.relay_controller.open(conveyor2=True) - - self.log_signal.emit(logging.INFO, Constant.str_feed_drop) - # 3. 与 Catch 模块进行状态交互来驱动投料动作 - # a. 初始状态 (CNone): 触发投料动作 - - if self.catch.catch_status == CatchStatus.CNone: - # 将 Catch 状态设置为 CDrop,通知 Catch 模块开始执行物理投料动作 - self.catch.catch_status = CatchStatus.CDrop - # 立即返回,等待 Catch 模块处理 - return - - # b. 投料进行中 (CDrop): 等待完成 - - if self.catch.catch_status == CatchStatus.CDrop: - # 什么都不做,等待 Catch 模块完成动作并更新状态 - return - # c. 投料完成 (COk): 处理后续逻辑并移动到下一个点 - if self.catch.catch_status == CatchStatus.COk: - # 重置 Catch 状态,为下一次操作做准备 - self.catch.catch_status = CatchStatus.CNone - # (后续增加) 延时: 让物料稳定 - # time.sleep(self.robotClient.time_delay_put) - # (后续增加) 视觉确认: 拍照确认袋子已放置 - # self.detection.get_position(...) - # self.feedConfig.feedLine.set_take_position(...) - # 4. 更新业务逻辑:减少剩余袋数 - self.feedConfig.num = self.feedConfig.num - 1 - self.log_signal.emit(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}') - # 5. *** 关键步骤 ***: 移动到路径中的下一个点 - # next_position() 会根据当前的 feed_Mid_Status (FMid_Feed) - # 调用 next_Feed()。 - self.next_position() - - def run_reset(self): - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.reset_status == ResetStatus.RNone: - return - - if self.reset_status == ResetStatus.RStart: - if self.feedConfig == None: return - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - self.pos_index = -1 - self.pos_near_index = -1 - self.reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position,is_action=True): - self.pos_index = index - break - - if self.pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position) < min_distance: - min_distance = get_distance(pos_model.get_position(), real_position) - self.pos_near_index = index - if self.pos_near_index != -1: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_near_index + 1] - else: - return False - else: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_index+1] - self.reversed_positions = list(reversed(self.reversed_positions)) - self.reverse_index = 0 - self.send_emergency_sound() - self.current_position = PositionModel() - self.current_position.init_position(real_position) - self.reset_status = ResetStatus.RRunging - - if self.reset_status == ResetStatus.RRunging: - if not real_position.compare(self.current_position.get_position(),is_action=True): - return - pos_model = self.reversed_positions[self.reverse_index] - if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点 - pos_model = self.reversed_positions[self.reverse_index + 1] - self.reverse_index = self.reverse_index+1 - - if pos_model.lineType == LineType.CureMid.value: - pos_model1 = self.reversed_positions[self.reverse_index + 1] - self.sendTargPosition(real_position=pos_model.get_position(), move_type=MoveType.Cure, - real_position1=pos_model1.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model1 - self.reverse_index = self.reverse_index + 2 - else: - self.sendTargPosition(real_position=pos_model.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model - self.reverse_index = self.reverse_index + 1 - - if self.reverse_index == len(self.reversed_positions): - self.reset_status = ResetStatus.ROk - if self.reset_status == ResetStatus.ROk: - self.reset_status = ResetStatus.RNone - self.send_emergency_stop() - - def return_original_position(self): - - self.run_reverse = True - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.feedConfig == None: return - start_index = -1 - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - pos_index = -1 - pos_near_index = -1 - reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position): - pos_index = index - break - - if pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position)0.5: + #35KG是80 + _center_point=0 + if self.relay_controller.is_drop_35: + print("检测到35KG料带") + _center_point=80 loc_offsetX=loc_model_result['dx_mm'] - if abs(loc_model_result['dx_mm'])<200: + loc_offsetX=loc_offsetX-_center_point + if abs(loc_model_result['dx_mm'])<200+_center_point: loc_is_next=True print(f'{loc_image_path}:料带偏移{loc_offsetX}mm') else: @@ -590,12 +599,12 @@ class Feeding(QObject): self.log_signal.emit(logging.ERROR, f"视频模型异常:{e}") finally: if loc_is_next or Constant.DebugPosition: - self.feedConfig.feedLine.set_feeding_to_end(loc_offsetX) - self.next_position() - self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) + self.feedConfig.feedLine.set_feeding_to_end(loc_offsetX) + self.next_position() + self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) elif self.feedStatus == FeedStatus.FTake: - self.log_signal.emit(logging.INFO, Constant.str_feed_take) + #self.log_signal.emit(logging.INFO, Constant.str_feed_take) take_position = self.feedConfig.feedLine.get_take_position() if not take_position or not take_position.get_position(): self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) @@ -705,7 +714,7 @@ class Feeding(QObject): self.next_position() elif self.feedStatus == FeedStatus.FDropReset: if real_position.compare(self.get_current_position().get_position()): - self.log_signal.emit(logging.INFO, Constant.str_feed_drop_reset) + self.log_signal.emit(logging.INFO, "码垛后点") self.next_position() diff --git a/CU/Feeding_C.py b/CU/Feeding_C.py deleted file mode 100644 index 72ffb0a..0000000 --- a/CU/Feeding_C.py +++ /dev/null @@ -1,474 +0,0 @@ -# import logging -# import time -# -# import cv2 -# from PyQt5.QtWidgets import QMessageBox -# -# import Constant -# import Expection -# from Model.Position import Real_Position, Detection_Position -# from enum import Enum, IntEnum -# from COM.COM_Robot import RobotClient, DetectType -# from Model.RobotModel import CMDInstructRequest, MoveType -# from Util.util_time import CRisOrFall -# from Vision.camera_coordinate_dete import Detection -# from Util.util_log import log -# from Model.RobotModel import Instruction -# -# -# -# -# class FeedStatus(IntEnum): -# FNone = 0 -# FStart = 1 -# FCheck = 2 -# FMid = 3 -# FPhoto = 4 -# FTake = 5 -# FBroken1 = 6 -# FBroken2 =7 -# FShake = 8 -# FDropBag = 9 -# FFinished = 10 -# FReverse = 11 -# FStartReverse = 12 -# -# class LineType(Enum): -# Straight = 0 -# CureStart = 1 -# CureMid = 2 -# CureEnd = 3 -# -# -# class FeedMidStatus(Enum): -# FMid_Start = 1 -# FMid_Take = 2 -# FMid_Feed= 3 -# -# class FeedPosition: -# def __init__(self,status:FeedStatus,position:Real_Position): -# self.status = status -# self.position = position -# -# class FeedLine: -# def __init__(self, id, name, feed_positions:list): -# self.feed_positions = feed_positions -# self.feeding2end_pos_index = 0 -# self.origin2start_pos_index = 0 -# self.start2take_pos_index = 0 -# self.name = name -# self.id = id -# self.get_position_list() -# -# def get_current_feed_position(self): -# pos = self.feeding_to_end[self.feeding2end_pos_index] -# return pos -# def get_current_take_position(self): -# pos = self.start2take_pos_index[self.start2take_pos_index] -# return pos -# def get_current_start_position(self): -# pos = self.origin2start_pos_index[self.origin2start_pos_index] -# return pos -# -# def get_next_feed_position(self,reverse:bool=False): -# pos = self.feeding_to_end[self.feeding2end_pos_index] -# if reverse: -# self.feeding2end_pos_index -= 1 -# if self.feeding2end_pos_index < 0: -# self.feeding2end_pos_index = len(self.feeding_to_end) - 1 -# else: -# self.feeding2end_pos_index += 1 -# if self.feeding2end_pos_index >= len(self.feeding_to_end): -# self.feeding2end_pos_index = 0 -# return pos -# -# -# def get_next_start_position(self,reverse:bool=False): -# pos = self.origin2start_pos_index[self.origin2start_pos_index] -# if reverse: -# self.origin2start_pos_index -= 1 -# if self.origin2start_pos_index < 0: -# self.origin2start_pos_index = len(self.origin2start_pos) - 1 -# else: -# self.origin2start_pos_index += 1 -# if self.origin2start_pos_index >= len(self.origin2start_pos): -# self.origin2start_pos_index = 0 -# -# return pos -# -# def get_next_take_position(self,reverse:bool=False): -# pos = self.start2take_pos_index[self.start2take_pos_index] -# if reverse: -# self.start2take_pos_index -= 1 -# if self.start2take_pos_index < 0: -# self.start2take_pos_index = len(self.start2take_pos) - 1 -# else: -# self.start2take_pos_index += 1 -# if self.start2take_pos_index >= len(self.start2take_pos): -# self.start2take_pos_index = 0 -# return pos -# -# def get_take_position(self): -# for i in range(len(self.feeding_to_end)): -# if self.feeding_to_end[i].status == FeedStatus.FTake: -# return self.feeding_to_end[i] -# -# def set_take_position(self,position:Real_Position): -# for i in range(len(self.feeding_to_end)): -# if self.feeding_to_end[i].status == FeedStatus.FTake: -# self.feeding_to_end[i].position = position -# -# def get_position_list(self): -# index_start = -1 -# for i in range(len(self.feed_positions)): -# if self.feed_positions[i].status == FeedStatus.FStart: -# index_start = i -# break -# for i in range(len(self.feed_positions)): -# if self.feed_positions[i].status == FeedStatus.FPhoto: -# index_take = i -# -# self.origin_to_start = self.feed_positions[: index_start+1] -# self.start_to_take = self.feed_positions[index_start:index_take+1] -# self.feeding_to_end = self.feed_positions[index_take:] -# -# -# -# -# class FeedingConfig: -# def __init__(self, num: int, feedLine: FeedLine, photo_locs): -# self.num = num -# self.feedLine = feedLine -# self.photo_locs = [self.deal_photo_locs(p) for p in photo_locs] -# -# def deal_photo_locs(self, photo_loc): -# position_photo = Real_Position() -# position_photo.init_position(photo_loc[0], photo_loc[1], photo_loc[2], photo_loc[3], photo_loc[4], photo_loc[5]) -# return position_photo -# -# def get_line_info(self): -# pass -# -# -# class Feeding: -# def __init__(self, robotClient: RobotClient, detection: Detection): -# self.feedConfig = None -# self.feedStatus = FeedStatus.FNone -# self.robotClient = robotClient -# self.detection = detection -# self.detection_image = None -# self.init_detection_image() -# self.pause = False -# self.cRis_photo = CRisOrFall() -# self.feed_Mid_Status = FeedMidStatus.FMid_Start -# self.is_reverse = False -# pass -# -# def init_detection_image(self): -# self.detection_image = cv2.imread(Constant.feed_sign_path) -# -# def run(self): -# # 获取事件坐标 -# real_position = Real_Position() -# real_position.init_position(self.robotClient.status_model.world_0, -# self.robotClient.status_model.world_1, -# self.robotClient.status_model.world_2, -# self.robotClient.status_model.world_3, -# self.robotClient.status_model.world_4, -# self.robotClient.status_model.world_5) -# # real_position.init_position(0, -# # 0, -# # 0, -# # 0, -# # 0, -# # 0); -# -# if self.feedConfig == None: -# self.feedStatus = FeedStatus.FNone -# elif self.feedConfig.num == 0 and self.feedStatus!=FeedStatus.FReverse: -# self.feedStatus = FeedStatus.FNone -# -# if self.feedStatus == FeedStatus.FNone or self.pause: -# return -# elif self.feedStatus == FeedStatus.FCheck: -# log.log_message(logging.INFO, Constant.str_feed_check) -# # 1, 检查是否是三列 -# # 2, 检查是否有人 -# # if self.safe_check_columns() and self.safe_check_person(): -# # pass -# # else: -# # if self.feedConfig.num != 0: -# # self.next_target() -# # if == 原点 继续判断 -# # else: -# # QMessageBox.information(None, "提示", Constant.str_feed_safe_error_msgbox) -# if self.is_reverse: -# self.feed_Mid_Status = FeedMidStatus.FMid_Start -# else: -# self.feed_Mid_Status = FeedMidStatus.FMid_Take -# self.next_position(self.is_reverse) -# -# elif self.feedStatus == FeedStatus.FStart: -# log.log_message(logging.INFO, Constant.str_feed_start) -# if not self.robotClient.get_origin_position().compare(real_position) and not self.is_reverse: -# QMessageBox.information(None, "提示", Constant.str_feed_start_error) -# self.feedStatus = FeedStatus.FNone -# if self.is_reverse and self.robotClient.get_origin_position().compare(real_position): -# self.feedStatus = FeedStatus.FNone -# self.is_reverse = False -# -# self.feed_Mid_Status = FeedMidStatus.FMid_Start -# self.next_position(self.is_reverse) -# -# -# elif self.feedStatus == FeedStatus.FMid: -# log.log_message(logging.INFO, Constant.str_feed_mid) -# feed_pos = self.get_current_position() -# if feed_pos.position.compare(real_position): -# self.next_position(self.is_reverse) -# -# -# -# elif self.feedStatus == FeedStatus.FPhoto: -# log.log_message(logging.INFO, Constant.str_feed_photo) -# if self.feedConfig.num == 0: -# log.log_message(logging.INFO, Constant.str_feed_finish) -# self.is_reverse = True -# self.FeedMid_Status = FeedMidStatus.FMid_Take -# self.next_position(self.is_reverse) -# return -# -# if self.robotClient.type_detection == DetectType.EyeOutHand: -# self.feed_Mid_Status = FeedMidStatus.FMid_Feed -# self.next_position() -# return -# detect_pos_list = [] -# if not Constant.Debug: -# try: -# from Util.util_time import CRisOrFall -# if self.cRis_photo.Q(self.error_photo_count >= 5, True): -# QMessageBox.information(None, "提示", Constant.str_feed_photo_error_msgbox) -# self.error_photo_count = 0 -# log.log_message(logging.INFO, Constant.str_feed_photo_confirm) -# -# # TODO 返回初始状态 -# for pos in self.feedConfig.photo_locs: -# self.sendTargPosition(pos) -# while not pos.compare(real_position): # 可以优化 TODO -# if self.feedStatus == FeedStatus.FNone or not self.pause: -# return -# time.sleep(0.1) -# code, img, xyz, uvw, mng = self.detection.get_position() # 检测结果 -# self.detection_image = img -# if xyz != None: -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_success) -# # dp = Detection_Position().init_position(*xyz, *uvw) -# from Trace.handeye_calibration import R_matrix, getPosition -# rotation = R_matrix(self.robotClient.status_model.world_0, -# self.robotClient.status_model.world_1, -# self.robotClient.status_model.world_2, -# self.robotClient.status_model.world_3, -# self.robotClient.status_model.world_4, -# self.robotClient.status_model.world_5) -# -# # 黄老师给我的xyz和法向量 -# target_position, noraml_base = getPosition(*xyz, *uvw, rotation, *mng) -# detect_pos_list.append(Real_Position().init_position(*target_position[:3], *noraml_base)) -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_success) -# else: -# log.log_message(logging.ERROR, Constanstr_feed_takePhoto_fail + real_position.to_string()) -# z_diff, max_z_index = (lambda pts: ( -# max(pts, key=lambda p: p.Z).Z - min(pts, key=lambda p: p.Z).Z, -# pts.index(max(pts, key=lambda p: p.Z)) -# ))(detect_pos_list) -# if len(self.feedConfig.photo_locs) == 5: -# if z_diff < Constant.bag_height and len( -# detect_pos_list) == 3: # 第一次检测到没有高度差距开始三列拍照 TODO 保留全部的开关 -# # 拍照位置从五个变为三个 -# self.feedConfig.photo_locs = [detect_pos_list[0], detect_pos_list[2], detect_pos_list[4]] -# take_position = detect_pos_list[0] -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_front_finish) -# else: -# take_position = detect_pos_list[max_z_index] -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_front) -# else: -# if z_diff < Constant.bag_height: -# take_position = detect_pos_list[0] -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_new_line) -# else: -# take_position = detect_pos_list[max_z_index] -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_line) -# -# self.feedConfig.feedLine.set_take_position(take_position) ##TODO 检查有没有异常 -# self.next_position() -# except: -# log.log_message(logging.ERROR, Constant.str_feed_takePhoto_fail) -# self.error_photo_count += 1 -# else: -# self.feedConfig.feedLine.set_take_position(real_position) ##TODO 检查有没有异常 -# self.next_position() -# log.log_message(logging.INFO, Constant.str_feed_takePhoto_move) -# -# elif self.feedStatus == FeedStatus.FTake: -# log.log_message(logging.INFO, Constant.str_feed_take) -# if self.feedConfig.feedLine.get_take_position() != None: -# if self.feedConfig.feedLine.get_take_position().compare(real_position): -# # 打开吸嘴并返回 -# self.sendIOControl(self.robotClient.con_ios[0], 1) -# self.sendIOControl(self.robotClient.con_ios[1], 1) -# self.sendIOControl(self.robotClient.con_ios[2], 1) -# -# # TODO 检测是否通 不然报警 -# self.feedConfig.feedLine.set_take_position(None) -# time.sleep(self.robotClient.time_delay_take) -# log.log_message(logging.INFO, Constant.str_feed_take_success) -# -# -# -# elif self.feedStatus == FeedStatus.FBroken1: -# log.log_message(logging.INFO, Constant.str_feed_broken) -# if self.get_current_position().compare(real_position): -# self.next_position() -# -# -# elif self.feedStatus == FeedStatus.FBroken2: -# log.log_message(logging.INFO, Constant.str_feed_broken) -# if self.get_current_position().compare(real_position): -# self.next_position() -# -# elif self.feedStatus == FeedStatus.FShake: -# log.log_message(logging.INFO, Constant.str_feed_shake) -# if self.get_current_position().compare(real_position): -# # TODO 震动方案 -# time.sleep(self.robotClient.time_delay_shake) -# self.next_position() -# -# elif self.feedStatus == FeedStatus.FDropBag: -# log.log_message(logging.INFO, Constant.str_feed_drop) -# -# if self.get_current_position().compare(real_position): -# self.sendIOControl(self.robotClient.con_ios[0], 0) -# self.sendIOControl(self.robotClient.con_ios[1], 0) -# self.sendIOControl(self.robotClient.con_ios[2], 0) -# # TODO 检测是否断 不然报警 -# time.sleep(self.robotClient.time_delay_put) -# # TODO 获取目标位置 -# self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30, save_img_point=0, Height_reduce=30, width_reduce=30) -# -# self.feedConfig.num = self.feedConfig.num - 1 -# log.log_message(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}') -# self.next_position() -# -# -# -# -# def send_emergency_sound(self): -# self.sendIOControl(Constant.IO_EmergencyPoint, 1) -# -# def send_emergency_stop(self): -# self.sendIOControl(Constant.IO_EmergencyPoint, 0) -# -# def sendIOControl(self, IO_bit, IO_Status: int): -# -# IO_command = CMDInstructRequest() -# io_instruction = Instruction() -# io_instruction.IO = True -# io_instruction.io_status = IO_Status -# io_instruction.point = IO_bit # {"dsID":"HCRemoteCommand","reqType":"AddRCC","emptyList":"1","instructions":[{"oneshot":"1","action":"200","type":"0","io_status":"1","point":"15","delay":"0"}]} -# IO_command.dsID = 'HCRemoteCommand' -# IO_command.instructions.append(io_instruction) -# self.robotClient.add_sendQuene(IO_command.toString()) -# log.log_message(logging.INFO, f'{Constant.str_feed_io_control}{IO_bit},{IO_Status}') -# pass -# -# def sendTargPosition(self, real_position, move_type: MoveType = MoveType.WORLD, speed=Constant.speed,real_position1=None): -# position_instruction = Instruction() -# position_instruction.speed = speed -# position_instruction.m0 = real_position.X -# position_instruction.m1 = real_position.Y -# position_instruction.m2 = real_position.Z -# position_instruction.m3 = real_position.U -# position_instruction.m4 = real_position.V -# position_instruction.m5 = real_position.W -# -# position_instruction.action = move_type.value -# if position_instruction.action == 17: -# position_instruction.m0_p = real_position1.X -# position_instruction.m1_p = real_position1.Y -# position_instruction.m2_p = real_position1.Z -# position_instruction.m3_p = real_position1.U -# position_instruction.m4_p = real_position1.V -# position_instruction.m5_p = real_position1.W -# instruction_command = CMDInstructRequest() -# instruction_command.instructions.append(position_instruction) -# request_command = instruction_command.toString() -# -# log_str = f'移动到位置:{"姿势直线"}:' \ -# f'X:{position_instruction.m0}-' \ -# f'Y:{position_instruction.m1}-' \ -# f'Z:{position_instruction.m2}-' \ -# f'U:{position_instruction.m3}-' \ -# f'V:{position_instruction.m4}-' \ -# f'W:{position_instruction.m5}' -# -# try: -# log.log_message(logging.INFO, log_str) -# except: -# print("error") -# -# self.robotClient.add_sendQuene(request_command) -# pass -# -# -# def next_start(self,reverse=False): -# start_pos = self.feedConfig.feedLine.get_next_start_position(reverse) -# self.feedStatus = start_pos.status if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone -# if start_pos.lineType == LineType.CureMid: -# start_pos1 = self.feedConfig.feedLine.get_next_start_position(reverse) -# self.sendTargPosition(real_position=start_pos.position, move_type=MoveType.Cure, real_position1=start_pos1.position) -# else: -# self.sendTargPosition(start_pos.position) -# pass -# -# def next_take(self,reverse=False): -# take_pos = self.feedConfig.feedLine.get_next_take_position(reverse) -# self.feedStatus = take_pos.status if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone -# if take_pos.lineType == LineType.CureMid: -# take_pos1 = self.feedConfig.feedLine.get_next_take_position(reverse) -# self.sendTargPosition(real_position=take_pos.position, move_type=MoveType.Cure, real_position1=take_pos1.position) -# else: -# self.sendTargPosition(take_pos.position) -# pass -# -# def next_Feed(self,reverse=False): -# feed_pos = self.feedConfig.feedLine.get_next_feed_position(reverse) -# self.feedStatus = feed_pos.status if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone -# if feed_pos.lineType == LineType.CureMid: -# feed_pos1 = self.feedConfig.feedLine.get_next_feed_position(reverse) -# self.sendTargPosition(real_position=feed_pos.position, move_type=MoveType.Cure, real_position1=feed_pos1.position) -# else: -# self.sendTargPosition(feed_pos.position) -# -# def get_current_position(self): -# if self.feed_Mid_Status == FeedMidStatus.FMid_Start: -# return self.feedConfig.feedLine.get_current_start_position() -# elif self.feed_Mid_Status == FeedMidStatus.FMid_Take: -# return self.feedConfig.feedLine.get_current_take_position() -# elif self.feed_Mid_Status == FeedMidStatus.FMid_Feed: -# return self.feedConfig.feedLine.get_current_feed_position() -# def next_position(self,reverse=False): -# if self.feed_Mid_Status == FeedMidStatus.FMid_Start: -# self.next_start(reverse) -# elif self.feed_Mid_Status == FeedMidStatus.FMid_Take: -# self.next_take(reverse) -# elif self.feed_Mid_Status == FeedMidStatus.FMid_Feed: -# self.next_Feed(reverse) -# -# def safe_check_columns(self): -# return True -# pass -# -# def safe_check_person(self): -# return True -# pass -# diff --git a/CU/Feeding_old.py b/CU/Feeding_old.py deleted file mode 100644 index e6bcd2f..0000000 --- a/CU/Feeding_old.py +++ /dev/null @@ -1,809 +0,0 @@ -import copy -import logging -import random -import threading -import time - -import cv2 -import numpy as np -from PyQt5.QtWidgets import QMessageBox -from PySide6.QtCore import Signal, QObject -from PySide6.QtGui import QPixmap - -import Constant -import Expection -from CU.Catch import Catch, CatchStatus -from CU.Detect import Detect, DetectStatus -from Model.FeedModel import PositionModel -from Model.Position import Real_Position, Detection_Position -from enum import Enum, IntEnum -from COM.COM_Robot import RobotClient, DetectType -from Model.RobotModel import CMDInstructRequest, MoveType -from Trace.handeye_calibration import getPosition -from Trace.handeye_calibration import getxyz,getxyz1 -from Util.util_math import get_distance -from Util.util_time import CRisOrFall -#from Vision.camera_coordinate_dete import Detection -from Util.util_log import log -from Model.RobotModel import Instruction -from EMV.EMV import RelayController -class ResetStatus(Enum): - RNone = 0 - RStart = 1 - RRunging = 2 - ROk =3 - -class FeedStatus(IntEnum): - FNone = 0 - FStart = 1 - FCheck = 2 - FMid = 3 - FPhoto = 4 - FTake = 5 - FBroken1 = 6 - FBroken2 =7 - FShake = 8 - FDropBag = 9 - FFinished = 10 - FReverse = 11 - FStartReverse = 12 - -class LineType(Enum): - Straight = 0 - CureMid = 2 - CureEnd = 3 - WORLD = 4 - - -class FeedMidStatus(Enum): - FMid_Start = 1 - FMid_Take = 2 - FMid_Feed= 3 - -class FeedPosition: - def __init__(self,status:FeedStatus,position:Real_Position): - self.status = status - self.position = position - -class FeedLine: - def __init__(self, id, name, feed_positions:list): - self.feed_positions = copy.deepcopy(feed_positions) - self.feeding2end_pos_index = 0 - self.origin2start_pos_index = 0 - self.start2take_pos_index = 0 - self.name = name - self.id = id - - def get_current_feed_position(self,is_reverse): - pos = self.feeding_to_end[ (self.feeding2end_pos_index+1)%len(self.feeding_to_end) if is_reverse else self.feeding2end_pos_index-1] - return pos - def get_current_take_position(self,is_reverse): - pos = self.start_to_take[ (self.start2take_pos_index+1)%len(self.start_to_take) if is_reverse else self.start2take_pos_index-1] - return pos - def get_current_start_position(self,is_reverse): - pos = self.origin_to_start[(self.origin2start_pos_index+1)%len(self.origin_to_start) if is_reverse else self.origin2start_pos_index-1] - return pos - - def get_next_feed_position(self,reverse:bool=False): - pos = self.feeding_to_end[self.feeding2end_pos_index] - if reverse: - self.feeding2end_pos_index -= 1 - if self.feeding2end_pos_index < 0: - self.feeding2end_pos_index = len(self.feeding_to_end) - 1 - else: - self.feeding2end_pos_index += 1 - if self.feeding2end_pos_index >= len(self.feeding_to_end): - self.feeding2end_pos_index = 0 - return pos - - def get_next_start_position(self,reverse:bool=False): - pos = self.origin_to_start[self.origin2start_pos_index] - if reverse: - self.origin2start_pos_index -= 1 - if self.origin2start_pos_index < 0: - self.origin2start_pos_index = len(self.origin_to_start) - 1 - else: - self.origin2start_pos_index += 1 - if self.origin2start_pos_index >= len(self.origin_to_start): - self.origin2start_pos_index = 0 - - return pos - - def get_next_take_position(self,reverse:bool=False): - pos = self.start_to_take[self.start2take_pos_index] - if reverse: - self.start2take_pos_index -= 1 - if self.start2take_pos_index < 0: - self.start2take_pos_index = len(self.start_to_take) - 1 - else: - self.start2take_pos_index += 1 - if self.start2take_pos_index >= len(self.start_to_take): - self.start2take_pos_index = 0 - return pos - def get_take_position(self): - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - return self.feeding_to_end[i] - - def set_take_position(self, position: Real_Position, dynamic_height=0): - print("[调试] 开始设置抓取位置") - print(f"传入的 position 坐标: X={position.X}, Y={position.Y}, Z={position.Z}, " - f"a={position.a}, b={position.b}, c={position.c}, " - f"U={position.U}, V={position.V}, W={position.W}") - - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - xyz = getxyz1(position.X, position.Y, position.Z, position.a, position.b, position.c) - - print(f"[调试] getxyz1 返回值: X={xyz[0]}, Y={xyz[1]}, Z={xyz[2]}") - - befor_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - print( - f"[调试] 抓取前位置: X={befor_take_position.X}, Y={befor_take_position.Y}, Z={befor_take_position.Z}, " - f"U={befor_take_position.U}, V={befor_take_position.V}, W={befor_take_position.W}") - - after_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - print( - f"[调试] 抓取后位置: X={after_take_position.X}, Y={after_take_position.Y}, Z={after_take_position.Z}, " - f"U={after_take_position.U}, V={after_take_position.V}, W={after_take_position.W}") - - self.feeding_to_end[i - 1].set_position(befor_take_position) - self.feeding_to_end[i + 1].set_position(after_take_position) - self.feeding_to_end[i].set_position(position) - - print(f"[调试] 当前抓取点已设置: X={position.X}, Y={position.Y}, Z={position.Z}, " - f"U={position.U}, V={position.V}, W={position.W}") - print("[调试] 抓取前后位置已设置完成") - - def set_drop_position(self, position: Real_Position): - """ - 设置 FDropBag 位置,只设置当前点,不处理前后点。 - :param position: 新的丢包位置 - """ - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FDropBag.value: - # 直接设置当前点的位置 - self.feeding_to_end[i].set_position(position) - print( - f"✅ FDropBag 位置已更新: ({position.X}, {position.Y}, {position.Z}, {position.U}, {position.V}, {position.W})") - break # 假设只有一个丢包点 - - def get_position_list(self): - index_start = -1 - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FCheck.value: - index_start = i - break - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FPhoto.value: - index_take = i - - self.origin_to_start = self.feed_positions[: index_start+1] - self.start_to_take = self.feed_positions[index_start:index_take+1] - self.feeding_to_end = self.feed_positions[index_take:] - - for i in range(len(self.feeding_to_end)): #插入动态中间点 - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - befor_position_model = PositionModel() - befor_position_model.init_position(None) - after_position_model = PositionModel() - after_position_model.init_position(None) - - self.feeding_to_end.insert(i, befor_position_model) - self.feeding_to_end.insert(i+2, after_position_model) - break - -class FeedingConfig: - def __init__(self, num: int, feedLine: FeedLine, photo_locs): - self.num = num - self.feedLine = feedLine - self.photo_locs = [self.deal_photo_locs(p) for p in photo_locs] - - def deal_photo_locs(self, photo_loc): - position_photo = Real_Position() - position_photo.init_position(photo_loc[0], photo_loc[1], photo_loc[2], photo_loc[3], photo_loc[4], photo_loc[5]) - return position_photo - - def get_line_info(self): - pass - - -class Feeding(QObject): - need_origin_signal = Signal(str) - take_no_photo_sigal = Signal() - update_detect_image = Signal(np.ndarray) - log_signal = Signal(int,str) - def __init__(self, robotClient: RobotClient): - super().__init__() - self.feedConfig = None - self.feedStatus = FeedStatus.FNone - self.robotClient = robotClient - # 添加 RelayController 实例 - self.relay_controller = RelayController() - self.sensor_thread = None - self.detection_image = None - self.init_detection_image() - self.pause = False - self.cRis_photo = CRisOrFall() - self.cRis_shake = CRisOrFall() - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.is_reverse = False - # 复位集合 - self.run_reverse = False - self.take_no_photo = False - self.reset_status = ResetStatus.RNone - self.reversed_positions = [] - self.current_position = None - self.index=1 - self.pos_index = -1 - self.pos_near_index = -1 - self.catch = Catch(self.robotClient) - self.detect = Detect() - self.is_detected = True - self.detect_thread = threading.Thread(target=self.run_detect) - self.detect_thread.start() - self.onekey = False - self.debug_run_count = 0 # 初始化计数器 - self.mid_take_count = 0 - #传感器判断抓包参数 - self.sensor2_ready = False # 传感器2是否检测到料包 - self.motor_stopped_by_sensor2 = False # 是否由传感器2触发停止电机 - self.sensor_thread = None - self.relay_controller = RelayController() - # 启动传感器2线程 - self.relay_controller._running = True - self.sensor2_thread = None - pass - - def close_feed(self): - self.is_detected = False - self.detect_thread.join() - self.detect.detection.release() - - def init_detection_image(self): - detection_image = cv2.imread(Constant.feed_sign_path) - self.update_detect_image.emit(detection_image) - - def run_detect(self): - while self.is_detected: - self.detect.run() - time.sleep(0.02) - - def run(self): - self.catch.run() - # 获取事件坐标 - real_position = Real_Position() - self.detect.position_index = 0 - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - # real_position.init_position(0, - # 0, - # 0, - # 0, - # 0, - # 0); - - # img_path = f'Image/{self.index}.png' - # img = cv2.imread(img_path) - # self.index += 1 - # self.index = self.index % 4 - # self.detection_image = img - - if self.feedConfig == None: - self.feedStatus = FeedStatus.FNone - - if self.feedConfig !=None and self.feedConfig.num == 0 and self.is_reverse and self.robotClient.origin_position.compare(real_position,is_action=True): - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - self.log_signal.emit(logging.INFO, Constant.str_feed_reverse) - - if self.feedStatus == FeedStatus.FNone or self.pause: - return - - elif self.feedStatus == FeedStatus.FCheck: - self.log_signal.emit(logging.INFO, Constant.str_feed_check) - # 1, 检查是否是三列 - # 2, 检查是否有人 - # if self.safe_check_columns() and self.safe_check_person(): - # pass - # else: - # if self.feedConfig.num != 0: - # self.next_target() - # if == 原点 继续判断 - # else: - # QMessageBox.information(None, "提示", Constant.str_feed_sae_error_msgbox) - - if self.is_reverse: - self.feed_Mid_Status = FeedMidStatus.FMid_Start - else: - self.feed_Mid_Status = FeedMidStatus.FMid_Take - - if self.feedConfig.feedLine.start_to_take[0].get_position().compare(real_position): - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FStart: - self.log_signal.emit(logging.INFO, Constant.str_feed_start) - self.relay_controller.open(conveyor2=True)#开电机 - #self.sensor2_thread = threading.Thread(target=self.relay_controller.handle_sensor2, daemon=True)#线程2的开始,但是在那里设置结束呢 - #self.sensor2_thread.start() - if not self.robotClient.origin_position.compare(real_position,is_action=True) and not self.is_reverse: - # QMessageBox.information(None, "提示", Constant.str_feed_start_error) # Fuck 引起异常 - self.log_signal.emit(logging.ERROR, Constant.str_feed_start_error) - self.need_origin_signal.emit(Constant.str_feed_start_error) - self.feedStatus = FeedStatus.FNone - return - if self.is_reverse: - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - return - - self.feedConfig.feedLine.get_position_list() - self.detect.detect_status = DetectStatus.DNone - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FMid: - feed_pos = self.get_current_position(self.is_reverse) - if feed_pos.get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_mid) - self.next_position(self.is_reverse) - # 增加计数器逻辑 - self.mid_take_count += 1 - # 可选:在 Debug1 模式下输出日志 - if Constant.Debug1: - self.log_signal.emit( - logging.INFO, - f"[调试计数] 已进入 FMid 分支 {self.mid_take_count} 次" - ) - if self.feedStatus == FeedStatus.FTake: - self.catch.catch_status = CatchStatus.CTake - - elif self.feedStatus == FeedStatus.FPhoto: - if self.feedConfig.num == 0: - self.log_signal.emit(logging.INFO, Constant.str_feed_finish) - self.is_reverse = True - self.feed_Mid_Status = FeedMidStatus.FMid_Take - self.feedConfig.feedLine.start2take_pos_index = len(self.feedConfig.feedLine.start_to_take) - 2 - self.feedConfig.feedLine.origin2start_pos_index = len(self.feedConfig.feedLine.origin_to_start) - 2 - self.next_position(self.is_reverse) - self.log_signal.emit(logging.INFO, Constant.str_feed_photo) - self.init_detection_image() - return - - if not Constant.Debug: - self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto) - self.feed_Mid_Status = FeedMidStatus.FMid_Feed - self.detect.detect_status = DetectStatus.DOk - self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_success) - #self.feedConfig.feedLine.set_take_position(self.detect.detect_position, 0) - self.feedConfig.feedLine.set_take_position(real_position, 0) - self.next_position() - self.detect.detect_status = DetectStatus.DNone - self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) - #self.feedStatus = FeedStatus.FTake - - elif self.feedStatus == FeedStatus.FTake: - self.log_signal.emit(logging.INFO, Constant.str_feed_take) - take_position = self.feedConfig.feedLine.get_take_position() - if not take_position or not take_position.get_position(): - self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - return - if not take_position.get_position().compare(real_position, is_action=True): - self.log_signal.emit(logging.INFO, "🟡 机器人尚未到达抓料点位") - return - self.log_signal.emit(logging.INFO, "🟢 机器人已到达抓料点位") - '''real_position''' - # 一直等待传感器2信号,永不超时 - while True: - sensors = self.relay_controller.get_all_device_status('sensors') - sensor2_value = sensors.get(self.relay_controller.SENSOR2, False) - if sensor2_value: - self.log_signal.emit(logging.INFO, "✅ 传感器2检测到料包到位,开始执行抓取") - break # ✅ 条件满足,跳出循环,继续执行下面的代码 - else: - self.log_signal.emit(logging.INFO, "⏳ 等待传感器2料包信号...") - time.sleep(1) # 每秒检查一次 - # 执行抓取动作 - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CTake - if self.catch.catch_status == CatchStatus.CTake: - self.log_signal.emit(logging.INFO, "正在执行抓料动作...") - self.catch.catch_status = CatchStatus.COk - if self.catch.catch_status == CatchStatus.COk: - self.log_signal.emit(logging.INFO, Constant.str_feed_take_success) - if not self.sensor2_ready: - self.log_signal.emit(logging.INFO, "抓取完成,重新启动 conveyor2") - self.relay_controller.open(conveyor2=True) - self.catch.catch_status = CatchStatus.CNone - self.detect.detect_status = DetectStatus.DOk - self.log_signal.emit(logging.INFO, "修改丢包点") - # 输出当前抓取的索引(当前使用的点) - print(f"[调试] 即将丢包点位索引: {self.detect.position_index}") - # ✅ 先递增索引(准备下一个点) - self.detect.position_index += 1 - # ✅ 输出下一个要加载的索引 - print(f"[调试] 下一个要加载的索引: {self.detect.position_index}") - # ✅ 重新加载下一个点位(基于更新后的 index) - if not self.detect.run(): - self.log_signal.emit(logging.ERROR, "❌ 加载新点位失败,停止流程") - return - # ✅ 设置丢包点为新加载的点位 - self.feedConfig.feedLine.set_drop_position(self.detect.detect_position) - # ✅ 成功加载新点,继续执行后续逻辑 - self.debug_run_count += 1 - self.next_position() - return - else: - self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - - elif self.feedStatus == FeedStatus.FBroken1: - - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - - elif self.feedStatus == FeedStatus.FBroken2: - - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - elif self.feedStatus == FeedStatus.FShake: - if self.get_current_position().get_position().compare(real_position,is_action=True): - # TODO 震动方案 - self.log_signal.emit(logging.INFO, Constant.str_feed_shake) - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CShake - return - if self.catch.catch_status == CatchStatus.CShake: - # if self.feedConfig.feedLine.feeding_to_end[ - # self.feedConfig.feedLine.feeding2end_pos_index + 1].status != FeedStatus.FShake: - # self.catch.catch_status = CatchStatus.COk - # else: - self.catch.shake_continue.SetReset() - self.next_position() - if self.feedStatus!=FeedStatus.FShake: - self.catch.catch_status = CatchStatus.CNone - return - - elif self.feedStatus == FeedStatus.FDropBag: - if self.get_current_position().get_position().compare(real_position,is_action=True): - # self.sendIOControl(self.robotClient.con_ios[0], 0) - # self.sendIOControl(self.robotClient.con_ios[1], 0) - # self.sendIOControl(self.robotClient.con_ios[2], 0) - self.log_signal.emit(logging.INFO, Constant.str_feed_drop) - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CDrop - return - if self.catch.catch_status == CatchStatus.CDrop: - return - if self.catch.catch_status == CatchStatus.COk: - self.catch.catch_status = CatchStatus.CNone - # time.sleep(self.robotClient.time_delay_put) - # self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30, save_img_point=0, Height_reduce=30, width_reduce=30) - # self.feedConfig.feedLine.set_take_position(self.get_take_position()) - if self.detect.detect_status == DetectStatus.DNone: - self.detect.detect_status = DetectStatus.DDetect - self.feedConfig.num = self.feedConfig.num - 1 - self.log_signal.emit(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}') - self.next_position() - - def run_reset(self): - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.reset_status == ResetStatus.RNone: - return - - if self.reset_status == ResetStatus.RStart: - if self.feedConfig == None: return - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - self.pos_index = -1 - self.pos_near_index = -1 - self.reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position,is_action=True): - self.pos_index = index - break - - if self.pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position) < min_distance: - min_distance = get_distance(pos_model.get_position(), real_position) - self.pos_near_index = index - if self.pos_near_index != -1: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_near_index + 1] - else: - return False - else: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_index+1] - self.reversed_positions = list(reversed(self.reversed_positions)) - self.reverse_index = 0 - self.send_emergency_sound() - self.current_position = PositionModel() - self.current_position.init_position(real_position) - self.reset_status = ResetStatus.RRunging - - if self.reset_status == ResetStatus.RRunging: - if not real_position.compare(self.current_position.get_position(),is_action=True): - return - pos_model = self.reversed_positions[self.reverse_index] - if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点 - pos_model = self.reversed_positions[self.reverse_index + 1] - self.reverse_index = self.reverse_index+1 - - if pos_model.lineType == LineType.CureMid.value: - pos_model1 = self.reversed_positions[self.reverse_index + 1] - self.sendTargPosition(real_position=pos_model.get_position(), move_type=MoveType.Cure, - real_position1=pos_model1.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model1 - self.reverse_index = self.reverse_index + 2 - else: - self.sendTargPosition(real_position=pos_model.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model - self.reverse_index = self.reverse_index + 1 - - if self.reverse_index == len(self.reversed_positions): - self.reset_status = ResetStatus.ROk - if self.reset_status == ResetStatus.ROk: - self.reset_status = ResetStatus.RNone - self.send_emergency_stop() - - def return_original_position(self): - - self.run_reverse = True - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.feedConfig == None: return - start_index = -1 - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - pos_index = -1 - pos_near_index = -1 - reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position): - pos_index = index - break - - if pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position)Optional[LineModel]: """根据lineid加载所有码垛的路径信息""" #默认码垛的lineid从10开始 - _lineid=lineid+10 + if self.config_path==Constant.dropLine_set_file_35: + _lineid=lineid+11 + else: + _lineid=lineid+10 + # _lineid=lineid+10 line_model = LineModel(_lineid) line_model.line_category = 2 line_model.id = _lineid @@ -255,10 +259,14 @@ class DropPositionManager: def save_path_points(self, line_model: LineModel): """根据lineid保存所有码垛的路径信息""" #默认码垛的lineid从10开始,保存的时候减一 - _lineid=line_model.id-10 + if self.config_path==Constant.dropLine_set_file_35: + _lineid=line_model.id-11 + else: + _lineid=line_model.id-10 + # _lineid=line_model.id-10 if _lineid<=0: return - self.config.read(Constant.dropLine_set_file, encoding='utf-8') + self.config.read(self.config_path, encoding='utf-8') # 查找主表 DropLineX main_section = f"{Constant.dropLine_set_section}{_lineid}" if not self.config.has_section(main_section): @@ -267,7 +275,7 @@ class DropPositionManager: self.config.set(main_section, "id", str(_lineid)) _current_reset_index=1 _current_mid_index=1 - _current_drop_section_val=self._current_drop_section[main_section] + _current_drop_section_val=self._get_max_drop_section() # 保存每个DropPoints for i, pos in enumerate(line_model.positions): if pos.lineId == _lineid or pos.lineId == line_model.id: @@ -300,48 +308,24 @@ class DropPositionManager: #保存数据 pos.save_position_model(self.config) - with open(Constant.dropLine_set_file, 'w', encoding='utf-8') as f: + with open(self.config_path, 'w', encoding='utf-8') as f: self.config.write(f) def del_drop_point(self,section): - self.config.read(Constant.dropLine_set_file, encoding = 'utf-8') + self.config.read(self.config_path, encoding = 'utf-8') self.config.remove_section(section) - with open(Constant.dropLine_set_file, 'w', encoding='utf-8') as f: + with open(self.config_path, 'w', encoding='utf-8') as f: self.config.write(f) -def _get_point_debug_info(manager, pos, model): - config = manager.config - for sec in config.sections(): - if sec.startswith("DropPoints"): - try: - x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") - if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: - point_id = config.getint(sec, "id") - return f"📌 DropPoints{point_id} | id={point_id}" - except: pass - - elif sec.startswith("DropMidPoint"): - try: - parts = sec.split('-') - if len(parts) != 2: continue - point_id = int(''.join(filter(str.isdigit, parts[0]))) - level = int(parts[1]) - x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") - if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: - return f"📍 DropMidPoint{point_id}-{level} | id={point_id}, level={level}" - except: pass - - elif sec.startswith("ResetPoint"): - try: - parts = sec.split('-') - if len(parts) != 2: continue - point_id = int(''.join(filter(str.isdigit, parts[0]))) - level = int(parts[1]) - x, y, z = config.getfloat(sec, "x"), config.getfloat(sec, "y"), config.getfloat(sec, "z") - if abs(x - pos.X) < 0.001 and abs(y - pos.Y) < 0.001 and abs(z - pos.Z) < 0.001: - return f"🔙 ResetPoint{point_id}-{level} | id={point_id}, level={level}" - except: pass - return "❓ 未知点位" + def _get_max_drop_section(self): + """获取最大的DropPoints序号""" + max_section = 1 + for section in self.config.sections(): + if section.startswith("DropPoints"): + num_part = int(section.replace("DropPoints", "0")) + if num_part > max_section: + max_section = num_part + return max_section # 测试 if __name__ == "__main__": diff --git a/CU/list.ini b/CU/list.ini deleted file mode 100644 index 117d65b..0000000 --- a/CU/list.ini +++ /dev/null @@ -1,5 +0,0 @@ -[positions] -0 = 1, 1, 1, 1, 0.258, 0.258 -1 = 1, 1, 1, 1, 0.258, 0.258 -2 = 1, 1, 1, 1, 0.258, 0.258 -3 = 1, 1, 1, 1, 0.258, 0.258 \ No newline at end of file diff --git a/CU/sae.py b/CU/sae.py deleted file mode 100644 index 2f2c2b2..0000000 --- a/CU/sae.py +++ /dev/null @@ -1,843 +0,0 @@ -import copy -import logging -import random -import threading -import time - -import cv2 -import numpy as np -from PyQt5.QtWidgets import QMessageBox -from PySide6.QtCore import Signal, QObject -from PySide6.QtGui import QPixmap - -import Constant -import Expection -from CU.Catch import Catch, CatchStatus -from CU.Detect import Detect, DetectStatus -from Model.FeedModel import PositionModel -from Model.Position import Real_Position, Detection_Position -from enum import Enum, IntEnum -from COM.COM_Robot import RobotClient, DetectType -from Model.RobotModel import CMDInstructRequest, MoveType -from Trace.handeye_calibration import getPosition -from Trace.handeye_calibration import getxyz,getxyz1 -from Util.util_math import get_distance -from Util.util_time import CRisOrFall -#from Vision.camera_coordinate_dete import Detection -from Util.util_log import log -from Model.RobotModel import Instruction -from EMV.EMV import RelayController -class ResetStatus(Enum): - RNone = 0 - RStart = 1 - RRunging = 2 - ROk =3 - -class FeedStatus(IntEnum): - FNone = 0 - FStart = 1 - FCheck = 2 - FMid = 3 - FPhoto = 4 - FTake = 5 - FBroken1 = 6 - FBroken2 =7 - FShake = 8 - FDropBag = 9 - FFinished = 10 - FReverse = 11 - FStartReverse = 12 - -class LineType(Enum): - Straight = 0 - CureMid = 2 - CureEnd = 3 - WORLD = 4 - - -class FeedMidStatus(Enum): - FMid_Start = 1 - FMid_Take = 2 - FMid_Feed= 3 - -class FeedPosition: - def __init__(self,status:FeedStatus,position:Real_Position): - self.status = status - self.position = position - -class FeedLine: - def __init__(self, id, name, feed_positions:list,drop_positons:list): - self.feed_positions = copy.deepcopy(feed_positions) - self.drop_positions = copy.deepcopy(drop_positons) - self.feeding2end_pos_index = 0 - self.origin2start_pos_index = 0 - self.start2take_pos_index = 0 - self.name = name - self.id = id - - # --- 新增:用于存储从 ini 文件读取的多个投料点坐标 --- - # 这个列表将在加载 ini 时填充 [[x1,y1,z1,u1,v1,w1], [x2,y2,z2,u2,v2,w2], ...] - self.drop_point_list = [] - - def get_current_feed_position(self,is_reverse): - pos = self.feeding_to_end[ (self.feeding2end_pos_index+1)%len(self.feeding_to_end) if is_reverse else self.feeding2end_pos_index-1] - return pos - def get_current_take_position(self,is_reverse): - pos = self.start_to_take[ (self.start2take_pos_index+1)%len(self.start_to_take) if is_reverse else self.start2take_pos_index-1] - return pos - def get_current_start_position(self,is_reverse): - pos = self.origin_to_start[(self.origin2start_pos_index+1)%len(self.origin_to_start) if is_reverse else self.origin2start_pos_index-1] - return pos - - def get_next_feed_position(self,reverse:bool=False): - pos = self.feeding_to_end[self.feeding2end_pos_index] - if reverse: - self.feeding2end_pos_index -= 1 - if self.feeding2end_pos_index < 0: - self.feeding2end_pos_index = len(self.feeding_to_end) - 1 - else: - self.feeding2end_pos_index += 1 - if self.feeding2end_pos_index >= len(self.feeding_to_end): - self.feeding2end_pos_index = 0 - return pos - - def get_next_start_position(self,reverse:bool=False): - pos = self.origin_to_start[self.origin2start_pos_index] - if reverse: - self.origin2start_pos_index -= 1 - if self.origin2start_pos_index < 0: - self.origin2start_pos_index = len(self.origin_to_start) - 1 - else: - self.origin2start_pos_index += 1 - if self.origin2start_pos_index >= len(self.origin_to_start): - self.origin2start_pos_index = 0 - - return pos - - def get_next_take_position(self,reverse:bool=False): - pos = self.start_to_take[self.start2take_pos_index] - if reverse: - self.start2take_pos_index -= 1 - if self.start2take_pos_index < 0: - self.start2take_pos_index = len(self.start_to_take) - 1 - else: - self.start2take_pos_index += 1 - if self.start2take_pos_index >= len(self.start_to_take): - self.start2take_pos_index = 0 - return pos - def get_take_position(self): - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - return self.feeding_to_end[i] - - def get_drop_position(self): - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - return self.feeding_to_end[i] - - def set_take_position(self, position: Real_Position, dynamic_height=0): - print("[调试] 开始设置抓取位置") - print(f"传入的 position 坐标: X={position.X}, Y={position.Y}, Z={position.Z}, " - f"a={position.a}, b={position.b}, c={position.c}, " - f"U={position.U}, V={position.V}, W={position.W}") - - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - xyz = getxyz1(position.X, position.Y, position.Z, position.a, position.b, position.c) - - print(f"[调试] getxyz1 返回值: X={xyz[0]}, Y={xyz[1]}, Z={xyz[2]}") - - befor_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - print( - f"[调试] 抓取前位置: X={befor_take_position.X}, Y={befor_take_position.Y}, Z={befor_take_position.Z}, " - f"U={befor_take_position.U}, V={befor_take_position.V}, W={befor_take_position.W}") - - after_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - print( - f"[调试] 抓取后位置: X={after_take_position.X}, Y={after_take_position.Y}, Z={after_take_position.Z}, " - f"U={after_take_position.U}, V={after_take_position.V}, W={after_take_position.W}") - - self.feeding_to_end[i - 1].set_position(befor_take_position) - self.feeding_to_end[i + 1].set_position(after_take_position) - self.feeding_to_end[i].set_position(position) - - print(f"[调试] 当前抓取点已设置: X={position.X}, Y={position.Y}, Z={position.Z}, " - f"U={position.U}, V={position.V}, W={position.W}") - print("[调试] 抓取前后位置已设置完成") - - def set_drop_position(self, position: Real_Position): - """ - 设置 FDropBag 位置,只设置当前点,不处理前后点。 - :param position: 新的丢包位置 - """ - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FDropBag.value: - # 直接设置当前点的位置 - self.feeding_to_end[i].set_position(position) - print( - f"✅ FDropBag 位置已更新: ({position.X}, {position.Y}, {position.Z}, {position.U}, {position.V}, {position.W})") - break # 假设只有一个丢包点 - - def get_position_list(self): - index_start = -1 - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FCheck.value: - index_start = i - break - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FPhoto.value: - index_take = i - - self.origin_to_start = self.feed_positions[: index_start+1] - self.start_to_take = self.feed_positions[index_start:index_take+1] - self.feeding_to_end = self.feed_positions[index_take:] - - for i in range(len(self.feeding_to_end)): #插入动态中间点 - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - befor_position_model = PositionModel() - befor_position_model.init_position(None) - after_position_model = PositionModel() - after_position_model.init_position(None) - - self.feeding_to_end.insert(i, befor_position_model) - self.feeding_to_end.insert(i+2, after_position_model) - break - -class FeedingConfig: - def __init__(self, num: int, feedLine: FeedLine, photo_locs, drop_positions=None): - self.num = num - self.feedLine = feedLine - self.photo_locs = [self.deal_photo_locs(p) for p in photo_locs] - - # --- 新增: 存储投料点列表 --- - # 从UI界面读取 or 从txt文本读取 - self.drop_positions = [self.deal_photo_locs(p) for p in drop_positions] if drop_positions else [] - - def deal_photo_locs(self, photo_loc): - position_photo = Real_Position() - position_photo.init_position(photo_loc[0], photo_loc[1], photo_loc[2], photo_loc[3], photo_loc[4], photo_loc[5]) - return position_photo - - def get_line_info(self): - pass - - -class Feeding(QObject): - need_origin_signal = Signal(str) - take_no_photo_sigal = Signal() - update_detect_image = Signal(np.ndarray) - log_signal = Signal(int,str) - def __init__(self, robotClient: RobotClient): - super().__init__() - self.feedConfig = None - self.feedStatus = FeedStatus.FNone - self.robotClient = robotClient - # 添加 RelayController 实例 - self.relay_controller = RelayController() - self.sensor_thread = None - self.detection_image = None - # self.init_detection_image() - self.pause = False - self.cRis_photo = CRisOrFall() - self.cRis_shake = CRisOrFall() - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.is_reverse = False - # 复位集合 - self.run_reverse = False - self.take_no_photo = False - self.reset_status = ResetStatus.RNone - self.reversed_positions = [] - self.current_position = None - self.index=1 - self.pos_index = -1 - self.pos_near_index = -1 - self.catch = Catch(self.robotClient) - # self.detect = Detect() - # self.is_detected = True - # self.detect_thread = threading.Thread(target=self.run_detect) - # self.detect_thread.start() - self.onekey = False - # self.debug_run_count = 0 # 初始化计数器 - self.mid_take_count = 0 - #传感器判断抓包参数 - self.sensor2_ready = False # 传感器2是否检测到料包 - self.motor_stopped_by_sensor2 = False # 是否由传感器2触发停止电机 - self.sensor_thread = None - self.relay_controller = RelayController() - # 启动传感器2线程 - self.relay_controller._running = True - self.sensor2_thread = None - - # --- 新增: 用于码垛模式的投料点索引 --- - self.current_drop_index = 0 - - - def close_feed(self): - pass - # self.is_detected = False - # self.detect_thread.join() - # self.detect.detection.release() - - # def init_detection_image(self): - # detection_image = cv2.imread(Constant.feed_sign_path) - # self.update_detect_image.emit(detection_image) - - # def run_detect(self): - # while self.is_detected: - # self.detect.run() - # time.sleep(0.02) - - def run(self): - self.catch.run() - # 获取事件坐标 - real_position = Real_Position() - # self.detect.position_index = 0 - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - # real_position.init_position(0, - # 0, - # 0, - # 0, - # 0, - # 0); - - # img_path = f'Image/{self.index}.png' - # img = cv2.imread(img_path) - # self.index += 1 - # self.index = self.index % 4 - # self.detection_image = img - - if self.feedConfig == None: - self.feedStatus = FeedStatus.FNone - - if self.feedConfig != None and self.feedConfig.num == 0 and self.is_reverse and self.robotClient.origin_position.compare( - real_position, is_action=True): - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - self.log_signal.emit(logging.INFO, Constant.str_feed_reverse) - - if self.feedStatus == FeedStatus.FNone or self.pause: - return - - elif self.feedStatus == FeedStatus.FCheck: - self.log_signal.emit(logging.INFO, Constant.str_feed_check) - - if self.is_reverse: - self.feed_Mid_Status = FeedMidStatus.FMid_Start - else: - self.feed_Mid_Status = FeedMidStatus.FMid_Take - - if self.feedConfig.feedLine.start_to_take[0].get_position().compare(real_position): - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FStart: - self.log_signal.emit(logging.INFO, Constant.str_feed_start) - self.relay_controller.open(conveyor2=True)#开电机 - #self.sensor2_thread = threading.Thread(target=self.relay_controller.handle_sensor2, daemon=True)#线程2的开始,但是在那里设置结束呢 - #self.sensor2_thread.start() - if not self.robotClient.origin_position.compare(real_position,is_action=True) and not self.is_reverse: - # QMessageBox.information(None, "提示", Constant.str_feed_start_error) # Fuck 引起异常 - self.log_signal.emit(logging.ERROR, Constant.str_feed_start_error) - self.need_origin_signal.emit(Constant.str_feed_start_error) - self.feedStatus = FeedStatus.FNone - return - if self.is_reverse: - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - return - - self.feedConfig.feedLine.get_position_list() - # self.detect.detect_status = DetectStatus.DNone - self.feed_Mid_Status = FeedMidStatus.FMid_Start - # --- 修改: 初始化投料点索引 --- - self.current_drop_index = 0 - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FMid: - feed_pos = self.get_current_position(self.is_reverse) - if feed_pos.get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_mid) - self.next_position(self.is_reverse) - # 增加计数器逻辑 - self.mid_take_count += 1 - # 可选:在 Debug1 模式下输出日志 - if Constant.Debug1: - self.log_signal.emit( - logging.INFO, - f"[调试计数] 已进入 FMid 分支 {self.mid_take_count} 次" - ) - if self.feedStatus == FeedStatus.FTake: - self.catch.catch_status = CatchStatus.CTake - - elif self.feedStatus == FeedStatus.FPhoto: - self.log_signal.emit(logging.INFO, "🟡 [码垛模式] 跳过拍照定位步骤") - # 直接进入抓取状态或准备投料 - # 所以在 FPhoto 后,应该移动到抓取点 - take_position_model = self.feedConfig.feedLine.get_take_position() - if take_position_model: - self.log_signal.emit(logging.INFO, "[码垛模式] 准备移动到抓取点") - self.sendTargPosition(take_position_model.get_position(), speed=self.robotClient.feed_speed) - self.feedStatus = FeedStatus.FTake - else: - self.log_signal.emit(logging.ERROR, "[码垛模式] 无法获取抓取点位置!") - self.feedStatus = FeedStatus.FNone - return # 退出当前循环 - - elif self.feedStatus == FeedStatus.FTake: - self.log_signal.emit(logging.INFO, Constant.str_feed_take) - take_position = self.feedConfig.feedLine.get_take_position() - if not take_position or not take_position.get_position(): - self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - return - if not take_position.get_position().compare(real_position, is_action=True): - self.log_signal.emit(logging.INFO, "🟡 机器人尚未到达抓料点位") - return - self.log_signal.emit(logging.INFO, "🟢 机器人已到达抓料点位") - '''real_position''' - # 一直等待传感器2信号,永不超时 - wait_start = time.time() - timeout = 30 # 30秒超时,可根据需要调整 - sensor2_detected = False - while not sensor2_detected: - if time.time() - wait_start > timeout: - self.log_signal.emit(logging.ERROR, "⏰ FTake: 等待传感器2超时!") - self.feedStatus = FeedStatus.FNone - return - sensors = self.relay_controller.get_all_device_status('sensors') - sensor2_value = sensors.get(self.relay_controller.SENSOR2, False) - if sensor2_value: - self.log_signal.emit(logging.INFO, "✅ 传感器2检测到料包到位,开始执行抓取") - sensor2_detected = True - else: - self.log_signal.emit(logging.INFO, "⏳ FTake: 等待传感器2料包信号...") - time.sleep(0.2) # 每0.5秒检查一次 - # 执行抓取动作 - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CTake - if self.catch.catch_status == CatchStatus.CTake: - self.log_signal.emit(logging.INFO, "正在执行抓料动作...") - self.catch.catch_status = CatchStatus.COk - if self.catch.catch_status == CatchStatus.COk: - self.log_signal.emit(logging.INFO, Constant.str_feed_take_success) - if not self.sensor2_ready: - self.log_signal.emit(logging.INFO, "抓取完成,重新启动 conveyor2") - self.relay_controller.open(conveyor2=True) - self.catch.catch_status = CatchStatus.CNone - self.log_signal.emit(logging.INFO, "[码垛模式] 跳过视觉检测,准备投料") - # 移动到第一个(或当前)投料点 - if self.feedConfig.drop_positions and len(self.feedConfig.drop_positions) > self.current_drop_index: - first_drop_pos = self.feedConfig.drop_positions[self.current_drop_index] - self.log_signal.emit(logging.INFO, f"[码垛模式] 移动到投料点 {self.current_drop_index}") - self.sendTargPosition(first_drop_pos, speed=self.robotClient.feed_speed) - self.feedStatus = FeedStatus.FDropBag - else: - self.log_signal.emit(logging.ERROR, "[码垛模式] 投料点列表为空或索引错误!") - self.feedStatus = FeedStatus.FNone - return # 退出当前循环 - else: - self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - - elif self.feedStatus == FeedStatus.FBroken1: - - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - - elif self.feedStatus == FeedStatus.FBroken2: - - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - elif self.feedStatus == FeedStatus.FShake: - if self.get_current_position().get_position().compare(real_position,is_action=True): - # TODO 震动方案 - self.log_signal.emit(logging.INFO, Constant.str_feed_shake) - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CShake - return - if self.catch.catch_status == CatchStatus.CShake: - # if self.feedConfig.feedLine.feeding_to_end[ - # self.feedConfig.feedLine.feeding2end_pos_index + 1].status != FeedStatus.FShake: - # self.catch.catch_status = CatchStatus.COk - # else: - self.catch.shake_continue.SetReset() - self.next_position() - if self.feedStatus!=FeedStatus.FShake: - self.catch.catch_status = CatchStatus.CNone - return - - elif self.feedStatus == FeedStatus.FDropBag: - # 1. 确保配置了投料点 - if not self.feedConfig or not self.feedConfig.drop_positions: - self.log_signal.emit(logging.ERROR, "[码垛模式] 错误:未配置投料点列表!") - self.feedStatus = FeedStatus.FNone - return - - # 2. 获取当前目标投料点 (基于索引) - if self.current_drop_index >= len(self.feedConfig.drop_positions): - self.log_signal.emit(logging.ERROR, f"[码垛模式] 错误:投料点索引 {self.current_drop_index} 超出范围!") - self.feedStatus = FeedStatus.FNone - return - - target_drop_position = self.feedConfig.drop_positions[self.current_drop_index] - self.log_signal.emit(logging.INFO, f"[码垛模式] 当前目标投料点索引: {self.current_drop_index}") - - # 3. 检查是否到达目标投料点 - if target_drop_position.compare(real_position, is_action=True): - self.log_signal.emit(logging.INFO, f"[码垛模式] 到达投料点 {self.current_drop_index}") - - # 4. 执行投料动作 - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CDrop - self.log_signal.emit(logging.INFO, "[码垛模式] 开始执行投料动作...") - return # 等待下一周期检查 COk - if self.catch.catch_status == CatchStatus.CDrop: - self.log_signal.emit(logging.INFO, "[码垛模式] 投料动作进行中...") - return # 等待抓取模块完成 - if self.catch.catch_status == CatchStatus.COk: - self.catch.catch_status = CatchStatus.CNone - self.log_signal.emit(logging.INFO, f"[码垛模式] 在投料点 {self.current_drop_index} 投料完成") - - # 5. 更新投料计数 - self.feedConfig.num -= 1 - self.log_signal.emit(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}') - - # 6. 检查是否所有投料任务完成 - if self.feedConfig.num > 0: - # 7. 更新投料点索引 (循环) - self.current_drop_index = (self.current_drop_index + 1) % len(self.feedConfig.drop_positions) - self.log_signal.emit(logging.INFO, f"[码垛模式] 更新投料点索引为: {self.current_drop_index}") - - # 8. 移动到固定的抓取点 - take_position_model = self.feedConfig.feedLine.get_take_position() - if take_position_model: - self.log_signal.emit(logging.INFO, f"[码垛模式] 移动到固定抓取点...") - self.sendTargPosition(take_position_model.get_position(), speed=self.robotClient.feed_speed) - self.feedStatus = FeedStatus.FTake # 设置状态为 FTake - else: - self.log_signal.emit(logging.ERROR, "[码垛模式] 无法获取抓取点位置!") - self.feedStatus = FeedStatus.FNone - - else: - # 9. 所有投料完成 - self.log_signal.emit(logging.INFO, "[码垛模式] 所有投料任务完成") - # 可以选择返回原点或进入空闲状态 - # 例如,移动到原点 - # self.sendTargPosition(self.robotClient.origin_position, speed=self.robotClient.reset_speed) - # self.feedStatus = FeedStatus.FStartReverse # 或者自定义一个结束状态 - self.feedStatus = FeedStatus.FNone # 简单地结束 - - else: - # 如果还没到达目标投料点,可以打印日志或等待 - # (通常机器人移动指令发出后,会自动移动到位,下次循环再检查) - self.log_signal.emit(logging.INFO, f"[码垛模式] 正在移动到投料点 {self.current_drop_index}...") - - def run_reset(self): - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.reset_status == ResetStatus.RNone: - return - - if self.reset_status == ResetStatus.RStart: - if self.feedConfig == None: return - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - self.pos_index = -1 - self.pos_near_index = -1 - self.reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position,is_action=True): - self.pos_index = index - break - - if self.pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position) < min_distance: - min_distance = get_distance(pos_model.get_position(), real_position) - self.pos_near_index = index - if self.pos_near_index != -1: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_near_index + 1] - else: - return False - else: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_index+1] - self.reversed_positions = list(reversed(self.reversed_positions)) - self.reverse_index = 0 - self.send_emergency_sound() - self.current_position = PositionModel() - self.current_position.init_position(real_position) - self.reset_status = ResetStatus.RRunging - - if self.reset_status == ResetStatus.RRunging: - if not real_position.compare(self.current_position.get_position(),is_action=True): - return - pos_model = self.reversed_positions[self.reverse_index] - if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点 - pos_model = self.reversed_positions[self.reverse_index + 1] - self.reverse_index = self.reverse_index+1 - - if pos_model.lineType == LineType.CureMid.value: - pos_model1 = self.reversed_positions[self.reverse_index + 1] - self.sendTargPosition(real_position=pos_model.get_position(), move_type=MoveType.Cure, - real_position1=pos_model1.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model1 - self.reverse_index = self.reverse_index + 2 - else: - self.sendTargPosition(real_position=pos_model.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model - self.reverse_index = self.reverse_index + 1 - - if self.reverse_index == len(self.reversed_positions): - self.reset_status = ResetStatus.ROk - if self.reset_status == ResetStatus.ROk: - self.reset_status = ResetStatus.RNone - self.send_emergency_stop() - - def return_original_position(self): - - self.run_reverse = True - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.feedConfig == None: return - start_index = -1 - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - pos_index = -1 - pos_near_index = -1 - reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position): - pos_index = index - break - - if pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position)= len( - self.feeding_to_end): - return None # 或抛出异常 - # 直接返回当前索引指向的位置 - return self.feeding_to_end[self.feeding2end_pos_index] - - def get_current_take_position(self, is_reverse): - """获取当前抓取阶段的目标位置 """ - if not self.start_to_take or self.start2take_pos_index < 0 or self.start2take_pos_index >= len( - self.start_to_take): - return None # 或抛出异常 - return self.start_to_take[self.start2take_pos_index] - - def get_current_start_position(self, is_reverse): - """获取当前起始阶段的目标位置 """ - if not self.origin_to_start or self.origin2start_pos_index < 0 or self.origin2start_pos_index >= len( - self.origin_to_start): - return None - return self.origin_to_start[self.origin2start_pos_index] - - def _update_index(self, index_attr, list_attr, reverse): - """辅助函数:更新索引""" - current_index = getattr(self, index_attr) - current_list = getattr(self, list_attr) - if reverse: - current_index -= 1 - if current_index < 0: - current_index = len(current_list) - 1 - else: - current_index += 1 - if current_index >= len(current_list): - current_index = 0 - setattr(self, index_attr, current_index) - return current_index - - def get_next_feed_position(self, reverse: bool = False): - """ - 获取下一个投料位置,并更新索引。 - 这个方法负责处理 feeding_to_end 列表中的所有点,包括 FTake 前后动态点和 FDropBag 点。 - :param reverse: 是否反向获取 - :return: PositionModel 对象 - """ - if not self.feeding_to_end or self.feeding2end_pos_index < 0 or self.feeding2end_pos_index >= len( - self.feeding_to_end): - return None # 或抛出异常 - # 1. 获取当前索引指向的位置 - pos = self.feeding_to_end[self.feeding2end_pos_index] - # 2. 更新索引 (关键:实现顺序访问) - self._update_index('feeding2end_pos_index', 'feeding_to_end', reverse) - # 3. 返回之前获取的位置 - return pos - - def get_next_start_position(self, reverse: bool = False): - """获取下一个起始位置,并更新索引。""" - pos = self.origin_to_start[self.origin2start_pos_index] - self._update_index('origin2start_pos_index', 'origin_to_start', reverse) - return pos - - def get_next_take_position(self, reverse: bool = False): - """获取下一个抓取位置,并更新索引。""" - pos = self.start_to_take[self.start2take_pos_index] - self._update_index('start2take_pos_index', 'start_to_take', reverse) - return pos - - def get_take_position(self): - """ - 查找并返回 FTake 状态的位置。 - :return: PositionModel 对象或 None - """ - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - return self.feeding_to_end[i] - - def set_take_position(self, position: Real_Position, dynamic_height=0): - """ - 设置 FTake 位置,并更新其前后动态点的位置。 - :param position: 新的抓取位置 - :param dynamic_height: 动态高度调整 (如果需要) - """ - for i in range(len(self.feeding_to_end)): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - # 计算 XYZ 坐标 - #xyz = getxyz(position.X, position.Y, position.Z, position.a, position.b, position.c) - xyz = getxyz1(position.X, position.Y, position.Z, position.a, position.b, position.c) - # 创建 before 和 after 位置 - befor_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - after_take_position = Real_Position().init_position(xyz[0], - xyz[1], - xyz[2], - position.U, - position.V, - position.W) - # 安全检查索引 - if i > 0: - self.feeding_to_end[i - 1].set_position(befor_take_position) - else: - print("Warning: No position before FTake to update.") - self.feeding_to_end[i].set_position(position) - if i + 1 < len(self.feeding_to_end): - self.feeding_to_end[i + 1].set_position(after_take_position) - else: - print("Warning: No position after FTake to update.") - break # 抓料点暂时就一个 - - - - def get_position_list(self): - """ - 根据状态将 feed_positions 分割成 origin_to_start, start_to_take, feeding_to_end 三个列表。 - 并在 FTake 前后插入动态点。 - """ - index_start = -1 - index_take = -1 - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FCheck.value: - index_start = i - break - for i in range(len(self.feed_positions)): - if self.feed_positions[i].status == FeedStatus.FPhoto.value: - index_take = i - - if index_start == -1 or index_take == -1: - print("Error: FCheck or FPhoto position not found in feed_positions.") - # 可能需要抛出异常或设置默认值 - return - - self.origin_to_start = self.feed_positions[: index_start + 1] - self.start_to_take = self.feed_positions[index_start:index_take + 1] - self.feeding_to_end = self.feed_positions[index_take:] - - # 查找 FTake 并插入动态点 - take_found = False - i = 0 - while i < len(self.feeding_to_end): - if self.feeding_to_end[i].status == FeedStatus.FTake.value: - if take_found: - print("Warning: Multiple FTake positions found. Processing first one.") - break # 或处理多个,或抛出异常 - - # 创建动态点 - befor_position_model = PositionModel() - befor_position_model.init_position(None) - after_position_model = PositionModel() - after_position_model.init_position(None) - - # 插入动态点 (注意列表长度和索引的变化) - self.feeding_to_end.insert(i, befor_position_model) # 在 FTake 前插入 - i += 1 # 列表变长,索引后移 - self.feeding_to_end.insert(i + 1, after_position_model) # 在 FTake 后插入 (原 FTake 现在是 i) - # i += 1 # 如果需要继续遍历,可以增加索引 - take_found = True - break # 处理完第一个 FTake 就退出 - i += 1 - - -class FeedingConfig: - """ - FeedingConfig 类存储当前投料任务的配置信息, - 包括剩余数量、路径信息和拍照位置。 - """ - - def __init__(self, num: int, feedLine: FeedLine, photo_locs): - """ - 初始化投料配置。 - :param num: 剩余袋数 - :param feedLine: FeedLine 对象,包含路径信息 - :param photo_locs: 拍照位置列表 - """ - self.num = num - self.feedLine = feedLine - self.photo_locs = [self.deal_photo_locs(p) for p in photo_locs] - - def deal_photo_locs(self, photo_loc): - """ - 将元组或列表形式的坐标转换为 Real_Position 对象。 - :param photo_loc: [X, Y, Z, U, V, W] 的列表或元组 - :return: Real_Position 对象 - """ - position_photo = Real_Position() - position_photo.init_position(photo_loc[0], photo_loc[1], photo_loc[2], photo_loc[3], photo_loc[4], photo_loc[5]) - return position_photo - - def get_line_info(self): - pass - - -class Feeding(QObject): - need_origin_signal = Signal(str) - take_no_photo_sigal = Signal() - update_detect_image = Signal(np.ndarray) - log_signal = Signal(int, str) - - def __init__(self, robotClient: RobotClient): - super().__init__() - self.feedConfig = None - self.feedStatus = FeedStatus.FNone - self.robotClient = robotClient - - self.detection_image = None - self.init_detection_image() - self.pause = False - self.cRis_photo = CRisOrFall() - self.cRis_shake = CRisOrFall() - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.is_reverse = False - # 复位集合 - self.run_reverse = False - self.take_no_photo = False - self.reset_status = ResetStatus.RNone - self.reversed_positions = [] - self.current_position = None - self.index = 1 - self.pos_index = -1 - self.pos_near_index = -1 - self.catch = Catch(self.robotClient) - self.detect = Detect() - self.is_detected = True - self.detect_thread = threading.Thread(target=self.run_detect) - self.detect_thread.start() - self.onekey = False - self.mid_take_count = 0 - self.debug_run_count = 0 - pass - - def close_feed(self): - self.is_detected = False - self.detect_thread.join() - self.detect.detection.release() - - def init_detection_image(self): - detection_image = cv2.imread(Constant.feed_sign_path) - self.update_detect_image.emit(detection_image) - - def run_detect(self): - """检测线程函数。""" - while self.is_detected: - self.detect.run() - time.sleep(0.02) # 控制检测频率,米厂可以设置较大值 - - def run(self): - """ - 主运行逻辑,由外部循环调用。 - 这是一个状态机,根据 self.feedStatus 的值执行不同的操作。 - """ - self.catch.run() - # 获取机械臂位置 - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - - # --- 状态机主逻辑 --- - if self.feedConfig == None: - self.feedStatus = FeedStatus.FNone - - # 检查是否完成反向运行并回到原点 - if self.feedConfig != None and self.feedConfig.num == 0 and self.is_reverse and self.robotClient.origin_position.compare( - real_position, is_action=True): - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - self.log_signal.emit(logging.INFO, Constant.str_feed_reverse) - - if self.feedStatus == FeedStatus.FNone or self.pause: - return - - elif self.feedStatus == FeedStatus.FCheck: - self.log_signal.emit(logging.INFO, Constant.str_feed_check) - # 1, 检查是否是三列 - # 2, 检查是否有人 - # if self.safe_check_columns() and self.safe_check_person(): - # pass - # else: - # if self.feedConfig.num != 0: - # self.next_target() - # if == 原点 继续判断 - # else: - # QMessageBox.information(None, "提示", Constant.str_feed_safe_error_msgbox) - - # 根据是否反转,进行状态设置 - if self.is_reverse: - self.feed_Mid_Status = FeedMidStatus.FMid_Start - else: - self.feed_Mid_Status = FeedMidStatus.FMid_Take - - # 如果在起始点,则移动到下一个位置 - if self.feedConfig.feedLine.start_to_take[0].get_position().compare(real_position): - self.next_position(self.is_reverse) - - elif self.feedStatus == FeedStatus.FStart: - self.log_signal.emit(logging.INFO, Constant.str_feed_start) - # 检查是否在原点 (正向启动时) - if not self.robotClient.origin_position.compare(real_position, is_action=True) and not self.is_reverse: - # QMessageBox.information(None, "提示", Constant.str_feed_start_error) # Fuck 引起异常 - self.log_signal.emit(logging.ERROR, Constant.str_feed_start_error) - self.need_origin_signal.emit(Constant.str_feed_start_error) - self.feedStatus = FeedStatus.FNone - return - # 反向运行结束 - if self.is_reverse: - self.feedStatus = FeedStatus.FNone - self.is_reverse = False - return - - # 初始化位置列表 - self.feedConfig.feedLine.get_position_list() - self.detect.detect_status = DetectStatus.DNone - self.feed_Mid_Status = FeedMidStatus.FMid_Start - self.next_position(self.is_reverse) - - - - elif self.feedStatus == FeedStatus.FMid: - feed_pos = self.get_current_position(self.is_reverse) - if feed_pos.get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_mid) - self.next_position(self.is_reverse) - - # 增加计数器逻辑 - self.mid_take_count += 1 - # 可选:在 Debug1 模式下输出日志 - if Constant.Debug1: - self.log_signal.emit( - logging.INFO, - f"[调试计数] 已进入 FMid 分支 {self.mid_take_count} 次" - ) - if self.feedStatus == FeedStatus.FTake: - self.catch.catch_status = CatchStatus.CTake - - - elif self.feedStatus == FeedStatus.FPhoto: - if self.feedConfig.num == 0: - self.log_signal.emit(logging.INFO, Constant.str_feed_finish) - self.is_reverse = True - self.feed_Mid_Status = FeedMidStatus.FMid_Take - self.feedConfig.feedLine.start2take_pos_index = len(self.feedConfig.feedLine.start_to_take) - 2 - self.feedConfig.feedLine.origin2start_pos_index = len(self.feedConfig.feedLine.origin_to_start) - 2 - self.next_position(self.is_reverse) - self.log_signal.emit(logging.INFO, Constant.str_feed_photo) - self.init_detection_image() - return - - - if not Constant.Debug: - self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto) - self.feed_Mid_Status = FeedMidStatus.FMid_Feed - self.detect.detect_status = DetectStatus.DOk - self.log_signal.emit(logging.INFO, Constant.str_feed_takePhoto_success) - # ✅ 输出当前抓取的索引 - print(f"[调试] 即将抓取点位索引: {self.detect.position_index}") - self.log_signal.emit(logging.INFO, f"[调试] 当前抓取点位索引: {self.detect.position_index}") - # 设置当前抓取位置(使用当前 index) - self.feedConfig.feedLine.set_take_position(self.detect.detect_position, self.detect.position_index) - # ✅ 递增索引 - self.detect.position_index += 1 - # ✅ 输出下一个要加载的索引 - print(f"[调试] 下一个要加载的索引: {self.detect.position_index}") - # ✅ 重新加载下一个点位(基于更新后的 index) - self.detect.run() - # 增加计数器(用于调试显示执行次数) - self.debug_run_count += 1 - if Constant.Debug1: - self.log_signal.emit(logging.INFO, Constant.str_sys_runing) - self.log_signal.emit(logging.INFO, f"[调试计数] 当前已执行 {self.debug_run_count} 次") - self.next_position() - self.detect.detect_status = DetectStatus.DNone - if Constant.Debug1: - self.log_signal.emit(logging.INFO, Constant.str_sys_runing1) - self.log_signal.emit(logging.INFO, Constant.str_sys_runing2) - #self.feedStatus = FeedStatus.FTake - - elif self.feedStatus == FeedStatus.FTake: - self.log_signal.emit(logging.INFO, Constant.str_feed_take) - if self.feedConfig.feedLine.get_take_position().get_position() != None: - # 检查是否到达抓取点 - # self.take_no_photo = False - if self.feedConfig.feedLine.get_take_position().get_position().compare(real_position, is_action=True): - # 打开吸嘴并返回 - # self.sendIOControl(self.robotClient.con_ios[0], 1) - # self.sendIOControl(self.robotClient.con_ios[1], 1) - # self.sendIOControl(self.robotClient.con_ios[2], 1) - - self.log_signal.emit(logging.INFO, "到达抓料点位") - # 触发抓取动作 - # self.feedConfig.feedLine.set_take_position(None) - # time.sleep(self.robotClient.time_delay_take) - self.log_signal.emit(logging.INFO, Constant.str_feed_take_success) - if self.catch.catch_status == CatchStatus.COk: - # 抓取完成,移动到下一步 - self.next_position() - self.catch.catch_status = CatchStatus.CNone - if Constant.Debug1: - self.log_signal.emit(logging.INFO, Constant.str_sys_runing3) # 运行到这里了 - self.feedConfig.feedLine.get_take_position() - return - if self.catch.catch_status == CatchStatus.CTake: - # 抓取动作已发出,等待完成 (COk) - # self.catch.catch_status 应由 Catch 类在完成后设置为 COk - self.catch.catch_status = CatchStatus.COk - if Constant.Debug1: - self.log_signal.emit(logging.INFO, Constant.str_sys_runing1) # 运行到这里了2 - else: - self.log_signal.emit(logging.ERROR, Constant.str_feed_takePhoto_fail) - # self.take_no_photo = True - - # 继续获取图像 - # TODO - # self.feedConfig.feedLine.set_take_position(self.get_take_position()) - - - - - elif self.feedStatus == FeedStatus.FBroken1: - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - - elif self.feedStatus == FeedStatus.FBroken2: - if self.get_current_position().get_position().compare(real_position): - self.log_signal.emit(logging.INFO, Constant.str_feed_broken) - self.next_position() - - elif self.feedStatus == FeedStatus.FShake: - - if self.get_current_position().get_position().compare(real_position, is_action=True): - # TODO 震动方案 - self.log_signal.emit(logging.INFO, Constant.str_feed_shake) - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CShake - return - if self.catch.catch_status == CatchStatus.CShake: - # if self.feedConfig.feedLine.feeding_to_end[ - # self.feedConfig.feedLine.feeding2end_pos_index + 1].status != FeedStatus.FShake: - # self.catch.catch_status = CatchStatus.COk - # else: - self.catch.shake_continue.SetReset() - self.next_position() - if self.feedStatus != FeedStatus.FShake: - self.catch.catch_status = CatchStatus.CNone - return - - - elif self.feedStatus == FeedStatus.FDropBag: - # *** 处理投料点 (FDropBag) 的核心逻辑 *** - # 1. 确认机械臂是否已精确到达当前目标投料点 - # get_current_position() 会根据 self.feed_Mid_Status (应为 FMid_Feed) - # 调用 feedLine.get_current_feed_position(),从 feeding_to_end 列表获取 - # 由 feeding2end_pos_index 指向的点。 - if self.get_current_position().get_position().compare(real_position, is_action=True): - # 2. 记录日志:已到达投料点 - self.log_signal.emit(logging.INFO, Constant.str_feed_drop) - # 3. 与 Catch 模块进行状态交互来驱动投料动作 - # a. 初始状态 (CNone): 触发投料动作 - if self.catch.catch_status == CatchStatus.CNone: - # 将 Catch 状态设置为 CDrop,通知 Catch 模块开始执行物理投料动作 - self.catch.catch_status = CatchStatus.CDrop - # 立即返回,等待 Catch 模块处理 - return - - # b. 投料进行中 (CDrop): 等待完成 - if self.catch.catch_status == CatchStatus.CDrop: - # 什么都不做,等待 Catch 模块完成动作并更新状态 - return - # c. 投料完成 (COk): 处理后续逻辑并移动到下一个点 - if self.catch.catch_status == CatchStatus.COk: - # 重置 Catch 状态,为下一次操作做准备 - self.catch.catch_status = CatchStatus.CNone - - # (后续增加) 延时: 让物料稳定 - # time.sleep(self.robotClient.time_delay_put) - - # (后续增加) 视觉确认: 拍照确认袋子已放置 - # self.detection.get_position(...) - - # (后续增加) 更新抓取点: 如果需要根据放置情况调整下次抓取 - # self.feedConfig.feedLine.set_take_position(...) - - # 触发放置后检测 (如果需要,米厂可以不用) - if self.detect.detect_status == DetectStatus.DNone: - self.detect.detect_status = DetectStatus.DDetect - - # 4. 更新业务逻辑:减少剩余袋数 - self.feedConfig.num = self.feedConfig.num - 1 - self.log_signal.emit(logging.INFO, f'{Constant.str_feed_feed_num}{self.feedConfig.num}') - - # 5. *** 关键步骤 ***: 移动到路径中的下一个点 - # next_position() 会根据当前的 feed_Mid_Status (FMid_Feed) - # 调用 next_Feed()。 - self.next_position() - - def run_reset(self): - """执行复位操作 (状态机驱动)。""" - # 获取当前机械臂位置 - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.reset_status == ResetStatus.RNone: - # 无复位请求 - return - - if self.reset_status == ResetStatus.RStart: - # 无配置无法复位 - if self.feedConfig == None: return - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - self.pos_index = -1 - self.pos_near_index = -1 - self.reversed_positions = [] - - # 查找当前位置在路径中的索引 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position, is_action=True): - self.pos_index = index - break - - if self.pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - # 如果未精确找到,查找最近的位置 - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position) < min_distance: - min_distance = get_distance(pos_model.get_position(), real_position) - self.pos_near_index = index - # 确定复位路径 (从开始到最近/当前点) - if self.pos_near_index != -1: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_near_index + 1] - else: - self.log_signal.emit(logging.ERROR, "Cannot determine reset path.") - return False - else: - self.reversed_positions = self.feedConfig.feedLine.feed_positions[:self.pos_index + 1] - # 反转路径 - self.reversed_positions = list(reversed(self.reversed_positions)) - self.reverse_index = 0 # 复位路径索引 - self.send_emergency_sound() # 发出急停声音 - self.current_position = PositionModel() - self.current_position.init_position(real_position) - self.reset_status = ResetStatus.RRunging # 进入运行状态 - - if self.reset_status == ResetStatus.RRunging: - if not real_position.compare(self.current_position.get_position(), is_action=True): - return - pos_model = self.reversed_positions[self.reverse_index] - if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点 - pos_model = self.reversed_positions[self.reverse_index + 1] - self.reverse_index = self.reverse_index + 1 - - if pos_model.lineType == LineType.CureMid.value: - pos_model1 = self.reversed_positions[self.reverse_index + 1] - self.sendTargPosition(real_position=pos_model.get_position(), move_type=MoveType.Cure, - real_position1=pos_model1.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model1 - self.reverse_index = self.reverse_index + 2 - else: - self.sendTargPosition(real_position=pos_model.get_position(), speed=self.robotClient.reset_speed) - self.current_position = pos_model - self.reverse_index = self.reverse_index + 1 - - if self.reverse_index == len(self.reversed_positions): - self.reset_status = ResetStatus.ROk - if self.reset_status == ResetStatus.ROk: - self.reset_status = ResetStatus.RNone - self.send_emergency_stop() - - # 废弃代码 - def return_original_position(self): - - self.run_reverse = True - real_position = Real_Position() - real_position.init_position(self.robotClient.status_model.world_0, - self.robotClient.status_model.world_1, - self.robotClient.status_model.world_2, - self.robotClient.status_model.world_3, - self.robotClient.status_model.world_4, - self.robotClient.status_model.world_5) - if self.feedConfig == None: return - start_index = -1 - # for index in range(len(self.feedConfig.feedLine.positions)): - # if self.feedConfig.feedLine.positions[index].status == 2: - # start_index = index - pos_index = -1 - pos_near_index = -1 - reversed_positions = [] - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if pos_model.get_position().compare(real_position): - pos_index = index - break - - if pos_index == -1: - self.log_signal.emit(logging.ERROR, Constant.str_feed_return_original_position_fail) - min_distance = 99999999 - for index, pos_model in enumerate(self.feedConfig.feedLine.feed_positions): - if get_distance(pos_model.get_position(), real_position) < min_distance: - min_distance = get_distance(pos_model.get_position(), real_position) - pos_near_index = index - if pos_near_index != -1: - reversed_positions = self.feedConfig.feedLine.feed_positions[:pos_near_index + 1] - else: - return False - else: - reversed_positions = self.feedConfig.feedLine.feed_positions[:pos_index] - reversed_positions = list(reversed(reversed_positions)) - self.reverse_index = 0 - self.send_emergency_sound() - current_position = PositionModel() - current_position.init_position(real_position) - while self.run_reverse and self.reverse_index != len(reversed_positions): - if self.reverse_index != 0 and not real_position.compare(current_position.get_position()): - continue - # todo 缺少比对 - pos_model = reversed_positions[self.reverse_index] - if pos_model.status == FeedStatus.FTake.value: # 跳过取袋节点 - - pos_model = reversed_positions[self.reverse_index + 1] - # TODO take节点判断 - - if pos_model.lineType == LineType.CureMid.value: - pos_model1 = reversed_positions[self.reverse_index + 1] - self.sendTargPosition(real_position=pos_model.get_position(), move_type=MoveType.Cure, - real_position1=pos_model1.get_position(), speed=self.robotClient.reset_speed) - current_position = pos_model1 - self.reverse_index = self.reverse_index + 2 - else: - self.sendTargPosition(real_position=pos_model.get_position(), speed=self.robotClient.reset_speed) - current_position = pos_model - self.reverse_index = self.reverse_index + 1 - self.send_emergency_stop() - return True - - def send_emergency_sound(self): - """发送急停声音 IO 控制。""" - self.sendIOControl(Constant.IO_EmergencyPoint, 1) - - def send_emergency_stop(self): - """停止急停声音 IO 控制。""" - self.sendIOControl(Constant.IO_EmergencyPoint, 0) - - def sendIOControl(self, IO_bit, IO_Status: int): - """发送 IO 控制指令。""" - IO_command = CMDInstructRequest() - io_instruction = Instruction() - io_instruction.IO = True - io_instruction.io_status = IO_Status - io_instruction.point = IO_bit # {"dsID":"HCRemoteCommand","reqType":"AddRCC","emptyList":"1","instructions":[{"oneshot":"1","action":"200","type":"0","io_status":"1","point":"15","delay":"0"}]} - IO_command.dsID = 'HCRemoteCommand' - IO_command.instructions.append(io_instruction) - self.robotClient.add_sendQuene(IO_command.toString()) - self.log_signal.emit(logging.INFO, f'{Constant.str_feed_io_control}{IO_bit},{IO_Status}') - pass - - def sendTargPosition(self, real_position, move_type: MoveType = MoveType.WORLD, speed=5, real_position1=None): - """发送目标位置移动指令。""" - position_instruction = Instruction() - position_instruction.speed = speed - position_instruction.m0 = real_position.X - position_instruction.m1 = real_position.Y - position_instruction.m2 = real_position.Z - position_instruction.m3 = real_position.U - position_instruction.m4 = real_position.V - position_instruction.m5 = real_position.W - position_instruction.smooth = self.robotClient.smooth - - position_instruction.action = move_type.value - if position_instruction.action == 17: - position_instruction.m0_p = real_position1.X - position_instruction.m1_p = real_position1.Y - position_instruction.m2_p = real_position1.Z - position_instruction.m3_p = real_position1.U - position_instruction.m4_p = real_position1.V - position_instruction.m5_p = real_position1.W - instruction_command = CMDInstructRequest() - instruction_command.instructions.append(position_instruction) - request_command = instruction_command.toString() - - log_str = f'移动到位置:{"姿势直线" if move_type == MoveType.WORLD else "姿势曲线"}:' \ - f'X:{position_instruction.m0}-' \ - f'Y:{position_instruction.m1}-' \ - f'Z:{position_instruction.m2}-' \ - f'U:{position_instruction.m3}-' \ - f'V:{position_instruction.m4}-' \ - f'W:{position_instruction.m5}' - - try: - self.log_signal.emit(logging.INFO, log_str) - except Exception as e: - self.log_signal.emit(logging.ERROR, f"Logging error in sendTargPosition: {e}") - return # 如果日志发送失败,至少不要中断主流程 - print(request_command) - self.robotClient.add_sendQuene(request_command) - - # def get_take_position(self): - # if Constant.Debug: - # return self.robotClient.status_model.getRealPosition() - # _, img, xyz, uvw, points = self.detection.get_position(Point_isVision=False, Box_isPoint=True, First_Depth=True, Iter_Max_Pixel=30,save_img_point=0, Height_reduce=30, width_reduce=30) - # self.detection_image = img.copy() - # if xyz ==None or uvw==None or points==None: - # return None - # target_position,noraml_base = getPosition(*xyz,*uvw,None,points) - # - # position = Real_Position().init_position(*target_position[:3],*noraml_base[:3]) - # position.Z = position.Z+200 - # return position - - def next_start(self, reverse=False): - """移动到下一个起始位置。""" - start_pos = self.feedConfig.feedLine.get_next_start_position(reverse) - self.feedStatus = FeedStatus(start_pos.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone - if start_pos.lineType == LineType.CureMid.value: - start_pos1 = self.feedConfig.feedLine.get_next_start_position(reverse) - self.feedStatus = FeedStatus(start_pos1.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone - self.sendTargPosition(real_position=start_pos.get_position(), speed=self.robotClient.reset_speed, - move_type=MoveType.Cure, real_position1=start_pos1.get_position()) - elif start_pos.lineType == LineType.WORLD.value: - if self.robotClient.status_model.getAnglePosition().is_error_angel_move(start_pos.get_position(), - self.robotClient.max_angle_interval): - self.feedStatus = None - self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error) - else: - self.sendTargPosition(real_position=start_pos.get_position(), speed=self.robotClient.reset_speed, - move_type=MoveType.AXIS) - else: - self.sendTargPosition(real_position=start_pos.get_position(), speed=self.robotClient.reset_speed) - pass - - def next_take(self, reverse=False): - """移动到下一个抓取位置。""" - take_pos = self.feedConfig.feedLine.get_next_take_position(reverse) - self.feedStatus = FeedStatus(take_pos.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone - if take_pos.lineType == LineType.CureMid.value: - take_pos1 = self.feedConfig.feedLine.get_next_take_position(reverse) - self.feedStatus = FeedStatus(take_pos1.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone - self.sendTargPosition(real_position=take_pos.get_position(), move_type=MoveType.Cure, - real_position1=take_pos1.get_position(), speed=self.robotClient.feed_speed) - elif take_pos.lineType == LineType.WORLD.value: - if self.robotClient.status_model.getAnglePosition().is_error_angel_move(take_pos.get_position(), - self.robotClient.max_angle_interval): - self.feedStatus = None - self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error) - else: - self.sendTargPosition(real_position=take_pos.get_position(), speed=self.robotClient.feed_speed, - move_type=MoveType.AXIS) - - else: - self.sendTargPosition(real_position=take_pos.get_position(), speed=self.robotClient.feed_speed) - pass - - def next_Feed(self, reverse=False): - """ - 移动到 feeding_to_end 列表中的下一个位置。 - 这个方法负责处理所有在 feeding_to_end 列表中的点,包括 FTake 前后的动态点、FDropBag 点等。 - """ - # 1. 调用 FeedLine 的方法获取下一个位置对象 (并更新内部索引) - # get_next_feed_position 会返回当前索引指向的点, - # 然后根据 reverse 参数更新 feeding2end_pos_index。 - feed_pos = self.feedConfig.feedLine.get_next_feed_position(reverse) - - # 2. 更新主状态机,使其与即将移动到的位置状态一致 - self.feedStatus = FeedStatus(feed_pos.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone - # 3. 根据位置的 lineType 发送相应的移动指令 - if feed_pos.lineType == LineType.CureMid.value: - # 处理曲线运动 (需要两个点) - feed_pos1 = self.feedConfig.feedLine.get_next_feed_position(reverse) - self.feedStatus = FeedStatus(feed_pos1.status) if self.feedStatus != FeedStatus.FNone else FeedStatus.FNone - self.sendTargPosition(real_position=feed_pos.get_position(), move_type=MoveType.Cure, - real_position1=feed_pos1.get_position(), speed=self.robotClient.feed_speed) - elif feed_pos.lineType == LineType.WORLD.value: - # 处理直线/关节运动 - if self.robotClient.status_model.getAnglePosition().is_error_angel_move(feed_pos.get_position(), - self.robotClient.max_angle_interval): - self.feedStatus = None - self.log_signal.emit(logging.ERROR, Constant.str_feed_angle_error) - else: - self.sendTargPosition(real_position=feed_pos.get_position(), speed=self.robotClient.feed_speed, - move_type=MoveType.AXIS) - - else: - # 默认处理 (通常是直线 WORLD 运动) - # *** 处理 FDropBag 点 *** - # 当 feeding_to_end 列表中的点是 FDropBag (status=9) 时, - # 这段默认代码会被执行,发送移动到该点的指令。 - # 一旦机械臂到达该点,run() 方法的 FDropBag 分支就会被触发, - # 完成投料后,next_position() 又会被调用,继续移动到列表中的下一个点 - - self.sendTargPosition(real_position=feed_pos.get_position(), speed=self.robotClient.feed_speed) - - def get_current_position(self, is_reverse=False): - """ - 根据当前子阶段状态获取对应的目标位置。 - :param is_reverse: 是否反向 (传递给 FeedLine 方法) - :return: PositionModel 对象或 None - """ - if self.feed_Mid_Status == FeedMidStatus.FMid_Start: - return self.feedConfig.feedLine.get_current_start_position(self.is_reverse) - elif self.feed_Mid_Status == FeedMidStatus.FMid_Take: - return self.feedConfig.feedLine.get_current_take_position(self.is_reverse) - elif self.feed_Mid_Status == FeedMidStatus.FMid_Feed: - return self.feedConfig.feedLine.get_current_feed_position(self.is_reverse) - - def next_position(self, reverse=False): - """ - 根据当前子阶段状态移动到下一个位置。 - 这是驱动整个喂料流程前进的核心方法。 - :param reverse: 是否反向移动 - """ - if self.feed_Mid_Status == FeedMidStatus.FMid_Start: - self.next_start(reverse) - elif self.feed_Mid_Status == FeedMidStatus.FMid_Take: - self.next_take(reverse) - elif self.feed_Mid_Status == FeedMidStatus.FMid_Feed: - # *** 关键调用 ***: - # 当 feed_Mid_Status 是 FMid_Feed 时,next_position() 会调用 next_Feed()。 - # next_Feed() 内部调用 feedLine.get_next_feed_position(),该方法会获取 - # feeding_to_end 列表中当前索引指向的点,并将索引递增,从而实现按顺序访问。 - # 这使得 FTake 前后动态点和 FDropBag 点都能被顺序处理。 - self.next_Feed(reverse) - - def safe_check_columns(self): - return True - pass - - def safe_check_person(self): - return True - pass diff --git a/CU/test_Catch_EMV.py b/CU/test_Catch_EMV.py deleted file mode 100644 index 27d992d..0000000 --- a/CU/test_Catch_EMV.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -import unittest -from unittest.mock import patch, MagicMock - -# 假设你的模块名为 CU,Catch 定义在 CU/Catch.py -from CU.Catch import Catch, CatchStatus - -class TestCatchRelayControl(unittest.TestCase): - - @patch('CU.EMV.close') # 只mock close函数,因为我们只关心关闭电磁阀1 - def test_catch_status_ctake_calls_close_relay(self, mock_close): - # 创建一个 mock 的 RobotClient(不需要真实实现) - mock_robot_client = MagicMock() - mock_robot_client.time_delay_put = 0.5 - mock_robot_client.con_ios = [0, 1, 2] - - # 实例化 Catch 类 - catch_instance = Catch(mock_robot_client) - - # 设置状态为 CTake - catch_instance.catch_status = CatchStatus.CTake - - # 第一次 run,应该触发 close(1, 0, 0) - catch_instance.run() - - # 验证 close 是否被调用,并且是 close(1, 0, 0) - mock_close.assert_called_once_with(1, 0, 0) - - # 再次 run,不应再次调用 close - catch_instance.run() - self.assertEqual(mock_close.call_count, 1) # 确保只调用了一次 - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/CU/test_Detect.py b/CU/test_Detect.py deleted file mode 100644 index db9fca6..0000000 --- a/CU/test_Detect.py +++ /dev/null @@ -1,90 +0,0 @@ -import os -import configparser - -# 模拟 Real_Position 类 -class Real_Position: - def __init__(self): - self.X = 0 - self.Y = 0 - self.Z = 0 - self.A = 0 - self.B = 0 - self.C = 0 - - def init_position(self, x, y, z, a, b, c): - self.X = x - self.Y = y - self.Z = z - self.A = a - self.B = b - self.C = c - - def get_position(self): - return self - - def __str__(self): - return f"X:{self.X:.3f}, Y:{self.Y:.3f}, Z:{self.Z:.3f}, A:{self.A:.3f}, B:{self.B:.3f}, C:{self.C:.3f}" - - -# 模拟 DetectStatus -class DetectStatus: - DOk = "DOk" - - -# 实际要测试的类 -class Detect: - def __init__(self): - self.detection = "" - self.detect_status = DetectStatus.DOk - self.detect_position = None - self.position_index = 0 # 默认读取索引为 0 的点位 - - def run(self): - if self.detect_status == DetectStatus.DOk: - self.detect_position = None - config = configparser.ConfigParser() - config_file = os.path.join(os.path.dirname(__file__), 'list.ini') # 配置文件地址 - if not os.path.exists(config_file): - print("配置文件 list.ini 不存在") - return False - config.read(config_file) - if not config.has_section('positions'): - print("配置文件中没有 [positions] 段") - return False - if not config.has_option('positions', str(self.position_index)): - print(f"没有索引为 {self.position_index} 的点位") - return False - try: - # 读取配置项 - data = config.get('positions', str(self.position_index)).strip().split(',') - if len(data) != 6: - raise ValueError(f"点位数据格式错误(应为6个值): {data}") - - x, y, z, a, b, c = map(float, data) - # 初始化坐标 - self.detect_position = Real_Position() - self.detect_position.init_position(x, y, z, a, b, c) - return True - - except Exception as e: - print(f"读取点位时出错: {e}") - return False - return False - - -# ======================== -# 测试逻辑 -# ======================== -if __name__ == "__main__": - detect = Detect() - - print("🔧 开始测试 Detect.run() 是否能正确加载点位...\n") - - for index in range(12): # 测试索引 0~11 - detect.position_index = index - print(f"\n🔄 测试索引: {index}") - success = detect.run() - if success: - print(f"✅ 加载成功: {detect.detect_position}") - else: - print(f"❌ 加载失败(可能是越界或配置错误)") \ No newline at end of file diff --git a/Config/FeedLine.ini b/Config/FeedLine.ini index db871dc..2f885a3 100644 --- a/Config/FeedLine.ini +++ b/Config/FeedLine.ini @@ -20,10 +20,10 @@ status = 3 linetype = 4 [Position1] -x = -550.23053 -y = -1411.78418 +x = -550.177612 +y = -1411.833984 z = -825.0 -u = -149.776047 +u = -150.22406 v = 0.0 w = -0.0 id = 1 @@ -33,10 +33,10 @@ status = 3 linetype = 0 [Position12] -x = -550.23053 -y = -1411.78418 +x = -550.177612 +y = -1411.833984 z = -825.0 -u = -149.776047 +u = -150.22406 v = 0.0 w = -0.0 id = 12 @@ -59,10 +59,10 @@ status = 3 linetype = 4 [Position13] -x = 19.275372 +x = 19.283037 y = -1531.274658 -z = -59.998802 -u = -73.544907 +z = -59.997604 +u = -73.543732 v = 0.0 w = -0.0 id = 13 @@ -72,10 +72,10 @@ status = 3 linetype = 0 [Position14] -x = -550.23053 -y = -1411.78418 +x = -550.177612 +y = -1411.833984 z = -825.0 -u = -149.776047 +u = -150.22406 v = 0.0 w = -0.0 id = 14 @@ -85,10 +85,10 @@ status = 3 linetype = 0 [Position5] -x = -550.23053 -y = -1411.78418 +x = -550.177612 +y = -1411.833984 z = -1220.955688 -u = -149.776047 +u = -150.22406 v = 0.0 w = -0.0 id = 5 @@ -98,10 +98,10 @@ status = 5 linetype = 0 [Position15] -x = 19.275372 +x = 19.283037 y = -1531.274658 -z = -59.998802 -u = -73.544907 +z = -59.997604 +u = -73.543732 v = 0.0 w = -0.0 id = 15 @@ -137,10 +137,10 @@ status = 9 linetype = 0 [Position7] -x = -550.23053 -y = -1411.78418 -z = -825.0 -u = -149.776047 +x = -550.177612 +y = -1411.833984 +z = -425.0 +u = -150.22406 v = 0.0 w = -0.0 id = 7 diff --git a/Config/drop.ini b/Config/drop.ini index 19db38d..a44675e 100644 --- a/Config/drop.ini +++ b/Config/drop.ini @@ -22,12 +22,12 @@ status = 7 linetype = 4 [ResetPoint1-1] -x = -44.431 -y = -60.0 -z = -80.5 -u = 51.386 +x = -44.430626 +y = -59.997604 +z = -80.499 +u = 51.386665 v = 0.0 -w = 0.0 +w = -0.0 id = 1 order = 1 lineid = 1 @@ -36,7 +36,7 @@ linetype = 4 [DropPoints1] x = 1027.553 -y = -470.692 +y = -420.692 z = -1202.361 u = -148.482 v = 1.0 @@ -49,7 +49,7 @@ linetype = 0 [DropPoints2] x = 1027.553 -y = 729.308 +y = 679.308 z = -1202.361 u = -148.482 v = 2.0 @@ -75,7 +75,7 @@ linetype = 0 [DropPoints4] x = 1767.553 -y = -210.692 +y = -260.692 z = -1202.361 u = -58.482 v = 4.0 @@ -101,7 +101,7 @@ linetype = 0 [DropPoints6] x = 1607.553 -y = -470.692 +y = -450.692 z = -1002.361 u = 31.518 v = 6.0 @@ -114,7 +114,7 @@ linetype = 0 [DropPoints7] x = 1607.553 -y = 729.308 +y = 679.308 z = -1002.361 u = 31.518 v = 7.0 @@ -140,7 +140,7 @@ linetype = 0 [DropPoints9] x = 897.553 -y = -210.692 +y = -260.692 z = -1002.361 u = -58.482 v = 9.0 @@ -166,7 +166,7 @@ linetype = 0 [DropPoints11] x = 1027.553 -y = -470.692 +y = -420.692 z = -802.361 u = -148.482 v = 11.0 @@ -179,7 +179,7 @@ linetype = 0 [DropPoints12] x = 1027.553 -y = 729.308 +y = 679.308 z = -802.361 u = -148.482 v = 12.0 @@ -205,7 +205,7 @@ linetype = 0 [DropPoints14] x = 1767.553 -y = -210.692 +y = -260.692 z = -802.361 u = -58.482 v = 14.0 @@ -231,7 +231,7 @@ linetype = 0 [DropPoints16] x = 1607.553 -y = -470.692 +y = -450.692 z = -602.361 u = 31.518 v = 16.0 @@ -244,7 +244,7 @@ linetype = 0 [DropPoints17] x = 1607.553 -y = 729.308 +y = 679.308 z = -602.361 u = 31.518 v = 17.0 @@ -270,7 +270,7 @@ linetype = 0 [DropPoints19] x = 897.553 -y = -210.692 +y = -260.692 z = -602.361 u = -58.482 v = 19.0 @@ -296,8 +296,8 @@ linetype = 0 [DropPoints21] x = 1027.553 -y = -470.692 -z = -402.361 +y = -420.692 +z = -350.361 u = -148.482 v = 21.0 w = 0.0 @@ -309,8 +309,8 @@ linetype = 0 [DropPoints22] x = 1027.553 -y = 729.308 -z = -402.361 +y = 679.308 +z = -350.361 u = -148.482 v = 22.0 w = 0.0 @@ -323,7 +323,7 @@ linetype = 0 [DropPoints23] x = 1027.553 y = 129.308 -z = -402.361 +z = -350.361 u = -148.482 v = 23.0 w = 0.0 @@ -335,8 +335,8 @@ linetype = 0 [DropPoints24] x = 1767.553 -y = -210.692 -z = -402.361 +y = -260.692 +z = -350.361 u = -58.482 v = 24.0 w = 0.0 @@ -349,7 +349,7 @@ linetype = 0 [DropPoints25] x = 1767.553 y = 519.308 -z = -402.361 +z = -350.361 u = -238.482 v = 25.0 w = 0.0 @@ -361,8 +361,8 @@ linetype = 0 [DropPoints26] x = 1607.553 -y = -470.692 -z = -282.361 +y = -420.692 +z = -100.361 u = 31.518 v = 26.0 w = 0.0 @@ -374,8 +374,8 @@ linetype = 0 [DropPoints27] x = 1607.553 -y = 729.308 -z = -282.361 +y = 679.308 +z = -100.361 u = 31.518 v = 27.0 w = 0.0 @@ -388,7 +388,7 @@ linetype = 0 [DropPoints28] x = 1607.553 y = 129.308 -z = -282.361 +z = -100.361 u = 31.518 v = 28.0 w = 0.0 @@ -400,8 +400,8 @@ linetype = 0 [DropPoints29] x = 897.553 -y = -210.692 -z = -282.361 +y = -260.692 +z = -100.361 u = -58.482 v = 29.0 w = 0.0 @@ -414,7 +414,7 @@ linetype = 0 [DropPoints30] x = 897.553 y = 519.308 -z = -202.361 +z = -100.361 u = -238.482 v = 30.0 w = 0.0 diff --git a/Constant.py b/Constant.py index aea600f..4b60c5f 100644 --- a/Constant.py +++ b/Constant.py @@ -3,7 +3,7 @@ import os # 调试变量 Debug = False # 控制不加图像的Fphoto False是不加 Debug1 = False # 打印很多日志节点 -DebugPosition = False # 调试位置,关闭机器人和传感器及判断 +DebugPosition = True # 调试位置,关闭机器人和传感器及判断 # Debug2 = False feedStatus = True #feedStatus的状态打印 @@ -23,6 +23,7 @@ position_set_section = 'Position' reset_line_set_section = 'ResetLine' feedLine_set_file = f'.{os.sep}Config{os.sep}FeedLine.ini' dropLine_set_file = f'.{os.sep}Config{os.sep}drop.ini' +dropLine_set_file_35 = f'.{os.sep}Config{os.sep}drop-35.ini' resetLine_set_file = f'.{os.sep}Config{os.sep}reset_line.ini' MAX_Position_num = 40 MAX_Line_num = 10 diff --git a/EMV/EMV.py b/EMV/EMV.py index 733b85f..00a4a0b 100644 --- a/EMV/EMV.py +++ b/EMV/EMV.py @@ -4,7 +4,9 @@ import socket import binascii import time import threading +from datetime import datetime import logging +from typing import Optional from PySide6.QtCore import Signal, QObject import numpy as np from pandas.core.arrays import boolean @@ -133,6 +135,7 @@ class RelayController(QObject): self.sensor2_ready = False #默认不打开 self.motor_stopped_by_sensor2 = True + self.is_drop_35=False #是否是35码 # ===================== 基础通信方法 ===================== def send_command(self, command_hex, retry_count=2, source='unknown'): @@ -142,11 +145,15 @@ class RelayController(QObject): byte_data = binascii.unhexlify(command_hex) for attempt in range(retry_count): try: + # begin_time=time.time() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - sock.settimeout(10) + sock.settimeout(1) sock.connect((self.host, self.port)) sock.send(byte_data) response = sock.recv(1024) + + # end_time=time.time() + # print(f"({source}) 耗时: {end_time-begin_time:.3f}秒") # hex_response = binascii.hexlify(response).decode('utf-8') #if source == 'sensor': #print(f"[传感器响应] {hex_response}") @@ -158,7 +165,7 @@ class RelayController(QObject): except Exception as e: self.log_signal.emit(logging.INFO,f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") print(f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") - time.sleep(5) + time.sleep(1) self.trigger_alarm() return None @@ -221,7 +228,7 @@ class RelayController(QObject): print(f"[{command_type}] 无法获取响应数据") return responses - def get_emergency_is_pressed(self)->bool: + def get_emergency_is_pressed(self): "获取急停信号,DI 3 位为1,正常,DI 3为0时为按下急停状态,00000000000401020107 后四位01表示一个字节,最后一位(07)二进制对应开关量" "按下急停为" command = self.read_status_command.get("sensors") @@ -233,6 +240,7 @@ class RelayController(QObject): status_crc=response[8] loc_is_pressed =status_crc==1 and (status_byte & 0b100) == 0 # 0b100 表示第三位为1 else: + loc_is_pressed=None self.log_signal.emit(logging.ERROR,f"网络继电器[急停] 读取状态失败或响应无效") print(f"网络继电器[急停] 读取状态失败或响应无效") @@ -267,6 +275,37 @@ class RelayController(QObject): time.sleep(self.sensor1_loop_delay) return False + def is_valid_sensor_signal_stable(self, sensor_name, detection_duration=3.0, stability_duration=2.5, check_interval=0.1): + """ + 检测在指定时间窗口内是否存在持续稳定的有效信号 + 参数: + sensor_name: 传感器名称 + detection_duration: 总检测时间窗口(秒),默认为3秒 + stability_duration: 信号需要持续稳定的时间(秒),默认为2.5秒 + check_interval: 检测间隔(秒),默认为0.1秒 + + 返回: + True: 在时间窗口内检测到持续稳定的有效信号 + False: 未检测到持续稳定的有效信号 + """ + stable_start_time = None # 记录首次检测到有效信号的时间 + start_time = time.time() + if not self.is_valid_sensor(sensor_name): + return False # 传感器状态无效,返回 + else: + stable_start_time = time.time() # 首次检测到有效信号 + time.sleep(check_interval) + + while time.time() - start_time < detection_duration: + temp_is_valid = self.is_valid_sensor(sensor_name) + if temp_is_valid: + if time.time() - stable_start_time >= stability_duration: + return True # 信号持续稳定达到要求时间 + else: + stable_start_time = time.time() # 信号不稳定,重置计时 + time.sleep(check_interval) + return False + def is_valid_sensor_status_1(self, sensor_name): stable_count = 0 for _ in range(int(self.sensor_stable_duration / self.sensor2_loop_delay)): @@ -337,36 +376,110 @@ class RelayController(QObject): time.sleep(self.sensor2_loop_lost) return False - def is_valid_sensor_signal_stable(self, sensor_name, detection_duration=3.0, stability_duration=2.5, check_interval=0.1): + def is_valid_sensor_nowait(self,sensor_name): """ - 检测在指定时间窗口内是否存在持续稳定的有效信号 + 检查传感器状态是否有效,不等待,如果第一次没有信号不等待,有信号一起一秒钟 参数: sensor_name: 传感器名称 - detection_duration: 总检测时间窗口(秒),默认为3秒 - stability_duration: 信号需要持续稳定的时间(秒),默认为2.5秒 - check_interval: 检测间隔(秒),默认为0.1秒 - 返回: - True: 在时间窗口内检测到持续稳定的有效信号 - False: 未检测到持续稳定的有效信号 + True: 传感器状态有效 + False: 传感器状态无效 """ - stable_start_time = None # 记录首次检测到有效信号的时间 - start_time = time.time() - if not self.is_valid_sensor(sensor_name): - return False # 传感器状态无效,返回 - else: - stable_start_time = time.time() # 首次检测到有效信号 - time.sleep(check_interval) - - while time.time() - start_time < detection_duration: - temp_is_valid = self.is_valid_sensor(sensor_name) - if temp_is_valid: - if time.time() - stable_start_time >= stability_duration: - return True # 信号持续稳定达到要求时间 + stable_count = 0 + _try_nums=5 # 尝试次数 + for _num in range(_try_nums): + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + + if not response: + print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + return False else: - stable_start_time = None # 信号不稳定,重置计时 - time.sleep(check_interval) + temp_status_code = self.parse_status_code(response) + if temp_status_code in self.required_codes_1: + stable_count += 1 + if stable_count >= 3: + return True + else: + if _num==0: + #首次没有信号,直接返回 + return False + else: + stable_count = 0 + time.sleep(self.sensor2_loop_lost) return False + + + def is_valid_sensor_stable(self,sensor_name): + """ + 检查传感器状态是否有效 + 参数: + sensor_name: 传感器名称 + 返回: + True: 传感器状态有效 + False: 传感器状态无效 + """ + #检测一秒钟,首次没有信号直接返回 + if not self.is_valid_sensor_nowait(sensor_name): + return False + #需要增加超时时间,否则会一直等待 + stable_count = 0 + _try_nums=10 # 尝试次数 + for _ in range(_try_nums): + + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + if response: + temp_status_code = self.parse_status_code(response) + if temp_status_code in self.required_codes_1: + stable_count += 1 + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}:检测到信号,已检测 {stable_count} 次") + if stable_count >= 8: + return True + else: + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}:未检测到信号,已检测 {stable_count} 次") + else: + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}:[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + # else: + # stable_count = 0 + time.sleep(self.sensor2_loop_delay) + return False + + # def is_valid_sensor_signal_stable(self, sensor_name, detection_duration=3.0, stability_duration=2.5, check_interval=0.1): + # """ + # 检测在指定时间窗口内是否存在持续稳定的有效信号 + # 参数: + # sensor_name: 传感器名称 + # detection_duration: 总检测时间窗口(秒),默认为3秒 + # stability_duration: 信号需要持续稳定的时间(秒),默认为2.5秒 + # check_interval: 检测间隔(秒),默认为0.1秒 + + # 返回: + # True: 在时间窗口内检测到持续稳定的有效信号 + # False: 未检测到持续稳定的有效信号 + # """ + # stable_start_time = None # 记录首次检测到有效信号的时间 + # stable_end_time = None # 记录最后检测到有效信号的时间 + # start_time = time.time() + # if not self.is_valid_sensor_single(sensor_name): + # return False # 传感器状态无效,返回 + # else: + # stable_start_time = time.time() # 首次检测到有效信号 + # # stable_end_time = stable_start_time # 最后检测到有效信号 + # time.sleep(check_interval) + + # while time.time() - start_time < detection_duration: + # #1s时间 + # temp_is_valid = self.is_valid_sensor_single(sensor_name) + # if temp_is_valid: + # stable_start_time=time.time() + # else: + # stable_start_time = None # 信号不稳定,重置计时 + # # time.sleep(check_interval) + # if stable_start_time - start_time >= stability_duration: + # return True # 信号持续稳定达到要求时间 + # else: + # return False # ===================== 动作控制方法 ===================== def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False, conveyor2_reverse=False,belt=False,alarm=False,blow_sensor2=False): # if Constant.DebugPosition: @@ -380,7 +493,7 @@ class RelayController(QObject): time.sleep(self.delay_pusher) if conveyor2: self.send_command(self.valve_commands[self.CONVEYOR2]['open']) - time.sleep(self.delay_conveyor) + # time.sleep(0.01) if clamp: self.send_command(self.valve_commands[self.CLAMP]['open']) time.sleep(self.delay_clamp) @@ -409,10 +522,10 @@ class RelayController(QObject): time.sleep(self.delay_pusher) if conveyor2: self.send_command(self.valve_commands[self.CONVEYOR2]['close']) - time.sleep(self.delay_conveyor) + #time.sleep(self.delay_conveyor) if clamp: self.send_command(self.valve_commands[self.CLAMP]['close']) - time.sleep(self.delay_clamp) + time.sleep(0.05) if pusher1: self.send_command(self.valve_commands[self.PUSHER1]['close']) time.sleep(self.delay_pusher) @@ -496,11 +609,18 @@ class RelayController(QObject): _is_pause_close=True try: - if _is_signal or self.is_valid_sensor_status_1(self.SENSOR2): + # if _is_signal or self.is_valid_sensor_status_1(self.SENSOR2): + #motor_stopped_by_sensor2=False(在滚动的时候)才去检测信号,否则如果后面的料子 + #有信号了,不会在FPhoto后开滚筒 + if (not self.motor_stopped_by_sensor2) and (_is_signal or self.is_valid_sensor_stable(self.SENSOR2)): #检测到信号,如果之前是没有信号,关闭滚筒 - print('检查到sensor2信号') + #print('检查到sensor2信号') if _is_signal and self.is_valid_sensor2_status_lost(self.SENSOR2): - print('检查到sensor2信号消失') + self.log_signal.emit(logging.INFO,"检查到sensor2信号消失") + if self.is_drop_35: + time.sleep(3.5) + self.open(conveyor2_reverse=True) + time.sleep(2.5) self.close(conveyor2=True) #滚筒关闭标志 self.motor_stopped_by_sensor2 = True @@ -512,21 +632,23 @@ class RelayController(QObject): if self.sensor2_ready: #只有在FPhoto处才有效 _is_signal=True - if self.motor_stopped_by_sensor2: - print('开滚筒') - self.open(conveyor2=True) - self.motor_stopped_by_sensor2 = False + # if self.motor_stopped_by_sensor2: + # self.log_signal.emit(logging.INFO,"开滚筒2") + # print('开滚筒2开滚筒2开滚筒2开滚筒2') + # self.open(conveyor2=True) + # self.motor_stopped_by_sensor2 = False - # time.sleep(0.1) + time.sleep(0.01) continue elif self.sensor2_ready: #sensor2_ready:通过Feeding:FPhoto处控制是否启动 if self.motor_stopped_by_sensor2: - print('开滚筒') + self.log_signal.emit(logging.INFO,"开滚筒1") + print('开滚筒1开滚筒1开滚筒1开滚筒1') self.open(conveyor2=True) self.motor_stopped_by_sensor2 = False - time.sleep(2) + time.sleep(0.5) except Exception as e: print(f"SENSOR2 处理错误: {e}") self.log_signal.emit(logging.ERROR,f"SENSOR2 处理错误: {e}") @@ -546,6 +668,13 @@ class RelayController(QObject): """开启皮带""" self.open(belt=True) + def set_drop_35(self,is_drop_35): + """ + 设置是否是35码 + is_drop_35:True是,False否 + """ + self.is_drop_35=is_drop_35 + def stop_sensor(self,sensor1_thread,sensor2_thread): if not self._running: @@ -561,12 +690,15 @@ class RelayController(QObject): def handle_emergency_pressed(self): "处理急停按钮信号状态线程" - print('检查急停按钮状态1') + #print('检查急停按钮状态1') while self._running: try: - print('检查急停按钮状态') + #print('检查急停按钮状态') loc_is_pressed =self.get_emergency_is_pressed() + if loc_is_pressed is None: + time.sleep(0.5) + continue if loc_is_pressed: # 处理急停按钮信号状态 if not self.emergency_is_pressed: @@ -575,11 +707,11 @@ class RelayController(QObject): self.emergency_is_pressed=True self.emergency_signal.emit(True) else: - print('急停按钮未被按下') + #print('急停按钮未被按下') self.emergency_is_pressed=False self.emergency_signal.emit(False) time.sleep(0.5) except Exception as e: print(f"急停 处理错误: {e}") self.log_signal.emit(logging.ERROR,f"急停线程 处理错误: {e}") - time.sleep(2) + time.sleep(1) diff --git a/EMV/EMV_HC.py b/EMV/EMV_HC.py new file mode 100644 index 0000000..e27630b --- /dev/null +++ b/EMV/EMV_HC.py @@ -0,0 +1,412 @@ +import socket +import binascii +import time +from datetime import datetime +import logging + +class RelayController: + """ + 测试传感器2信号情况 + """ + def __init__(self, host='192.168.0.18', port=50000): + super().__init__() + # ===================== 全局线程延时参数 ===================== + self.sensor1_loop_delay = 0.1 # SENSOR1 线程轮询间隔(秒) + self.sensor1_error_delay = 1.0 # SENSOR1 出错或暂停时延时(秒) + self.sensor1_post_action_delay = 0.2 # SENSOR1 每次循环后延时(秒) + + self.sensor2_loop_delay = 0.2 # SENSOR2 线程轮询间隔(秒) + self.sensor2_loop_lost=0.1 # SENSOR2 线程轮询间隔(秒) + # self.sensor2_loop_delay = 0.5 # SENSOR2 线程轮询间隔(秒) + self.sensor2_error_delay = 0.5 # SENSOR2 出错时延时(秒) + self.sensor2_post_action_delay = 0.2 # SENSOR2 每次循环后延时(秒) + # ===================== 全局动作延时参数 ===================== + self.delay_conveyor = 0.5 # 传送带开/关动作延时(一半时间,我在控制程序和线程都加了一样的延时) + self.delay_pusher = 0.05 # 推板开/关动作延时 + self.delay_clamp = 0.5 # 夹爪动作延时 + self.delay_after_pusher = 5.0 # 推板推出后到重启传动带时间 + + self.emergency_is_pressed=False + + # ===================== 传感器稳定检测参数 ===================== + self.sensor_stable_duration = 1.0 # 传感器状态稳定检测时间(秒) + self.sensor_max_attempts = 3 # 连续检测次数达到此值判定有效 + self.sensor1_debounce_time = 1.0 # 传感器1防抖时间(秒) + + # ===================== 网络与设备映射 ===================== + self.host = host + self.port = port + + self.CONVEYOR1 = 'conveyor1' + self.PUSHER = 'pusher' + self.CONVEYOR2 = 'conveyor2' + self.CONVEYOR2_REVERSE = 'conveyor2_reverse' + self.CLAMP = 'clamp' + self.PUSHER1 = 'pusher1' + self.SENSOR1 = 'sensor1' + self.SENSOR2 = 'sensor2' + self.BELT = 'belt' + self.ALARM = 'alarm' + self.BLOW_SENSOR2 = 'blow_sensor2' + + self.valve_commands = { + #包装机皮带 + self.CONVEYOR1: {'open': '000000000006010500070000', 'close': '00000000000601050007FF00'}, + # self.CONVEYOR11: {'open': '00000000000601050000FF00', 'close': '000000000006010500000000'}, + self.PUSHER: {'open': '00000000000601050001FF00', 'close': '000000000006010500010000'}, + #滚筒,2000 0012正转,2000 0022 2001变频器频率调整 2000正反转。 + self.CONVEYOR2: {'open': '000100000006020620000012', 'close': '000100000006020620000001'}, + #DO4 + self.CLAMP: {'open': '00000000000601050003FF00', 'close': '000000000006010500030000'}, + #DO5 回 DO2推 + self.PUSHER1: {'open': '00000000000601050004FF00', 'close': '000000000006010500040000'}, + #D07 长皮带 + self.BELT: {'open': '00000000000601050006FF00', 'close': '000000000006010500060000'}, + #D01 声控报警 + self.ALARM: {'open': '00000000000601050000FF00', 'close': '000000000006010500000000'}, + #DO6 吹传感器2 + self.BLOW_SENSOR2: {'open': '00000000000601050005FF00', 'close': '000000000006010500050000'}, + #滚筒反转 + self.CONVEYOR2_REVERSE: {'open': '000100000006020620000022', 'close': '000100000006020620000001'} + } + + #devices:读取继点器的状态 + #sensors 传感器的状态 D12 + self.read_status_command = { + 'devices': '000000000006010100000008', + 'sensors': '000000000006010200000008' + } + + self.device_bit_map = { + self.CONVEYOR1: 0, + self.PUSHER: 1, + self.CONVEYOR2: 2, + self.CLAMP: 3, + self.PUSHER1: 4, + self.CONVEYOR2_REVERSE: 5, + self.BELT: 6, + self.ALARM: 7, + #self.BLOW_SENSOR2: 8 + } + + self.sensor_bit_map = { + self.SENSOR1: 0, + self.SENSOR2: 1, + } + + self.device_name_map = { + self.CONVEYOR1: "包装机皮带", + self.PUSHER: "推板开", + self.CONVEYOR2: "滚筒", + self.CLAMP: "机械臂夹爪", + self.PUSHER1: "推板关", + self.CONVEYOR2_REVERSE: "滚筒反转", + self.BELT: "皮带", + self.ALARM: "声控报警", + self.BLOW_SENSOR2: "吹传感器2" + } + + self.sensor_name_map = { + self.SENSOR1: '位置传感器1', + self.SENSOR2: '位置传感器2', + } + + # ===================== 状态控制变量 ===================== + self._running = False #线程运行标识 + self._ispause = False #线程暂停标识 + self._sensor1_thread = None + self._sensor2_thread = None + + self.required_codes = {'0101', '0103','0105','0107'} # 有效状态码(传感器1) + self.required_codes_1 = {'0102', '0103','0106','0107'} # 有效状态码(传感器2) + + self.sensor1_triggered = False + self.sensor1_last_time = 0 + + self.sensor2_ready = False #默认不打开 + self.motor_stopped_by_sensor2 = True + + # ===================== 基础通信方法 ===================== + def send_command(self, command_hex, retry_count=2, source='unknown'): + byte_data = binascii.unhexlify(command_hex) + for attempt in range(retry_count): + try: + # begin_time=time.time() + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + sock.settimeout(1) + sock.connect((self.host, self.port)) + sock.send(byte_data) + response = sock.recv(1024) + + # end_time=time.time() + # print(f"({source}) 耗时: {end_time-begin_time:.3f}秒") + # hex_response = binascii.hexlify(response).decode('utf-8') + #if source == 'sensor': + #print(f"[传感器响应] {hex_response}") + #elif source == 'device': + #print(f"[设备控制响应] {hex_response}") + #else: + #print(f"[通信响应] {hex_response}") + return response + except Exception as e: + self.log_signal.emit(logging.INFO,f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") + print(f"网络继电器通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") + time.sleep(1) + self.trigger_alarm() + return None + + def trigger_alarm(self): + self.log_signal.emit(logging.ERROR,"警告:网络继电器连续多次通信失败,请检查设备连接!") + print("警告:网络继电器连续多次通信失败,请检查设备连接!") + + # ===================== 状态读取方法 ===================== + def get_all_device_status(self, command_type='devices'): + # if Constant.DebugPosition: + # return {self.SENSOR2:True} + command = self.read_status_command.get(command_type) + if not command: + print(f"未知的网络继电器读取类型: {command_type}") + return {} + + source = 'sensor' if command_type == 'sensors' else 'device' + response = self.send_command(command, source=source) + status_dict = {} + + if response and len(response) >= 10: + status_byte = response[9] + status_bin = f"{status_byte:08b}"[::-1] + bit_map = self.device_bit_map if command_type == 'devices' else self.sensor_bit_map + # name_map = self.device_name_map if command_type == 'devices' else self.sensor_name_map + + for key, bit_index in bit_map.items(): + status_dict[key] = status_bin[bit_index] == '1' + else: + print(f"网络继电器[{command_type}] 读取状态失败或响应无效") + + return status_dict + + def get_all_sensor_responses(self, command_type='sensors'): + """ + 获取所有传感器的原始 Modbus 响应字符串 + 示例:{'sensor1': '00000000000401020101', 'sensor2': '00000000000401020100'} + """ + command = self.read_status_command.get(command_type) + if not command: + print(f"未知的读取类型: {command_type}") + return {} + + source = 'sensor' if command_type == 'sensors' else 'device' + response = self.send_command(command, source=source) + responses = {} + + if response and len(response) >= 10: + hex_response = binascii.hexlify(response).decode('utf-8') + # print(f"[原始响应][{command_type}] {hex_response}") + + # 假设传感器数据从第 9 字节开始,长度为 2 字节 + for name, bit_index in self.sensor_bit_map.items(): + offset = 9 + (bit_index // 8) + bit_pos = bit_index % 8 + byte = response[offset] + status = (byte >> bit_pos) & 1 + responses[name] = hex_response + else: + print(f"[{command_type}] 无法获取响应数据") + return responses + + def parse_status_code(self, response): + """ + 从 Modbus 响应字符串中提取状态码(后两位) + 示例:00000000000401020101 -> '01' + """ + if isinstance(response, str) and len(response) >= 18: + return response[16:20] + return None + + def is_valid_sensor_status(self, sensor_name): + stable_count = 0 + for _ in range(int(self.sensor_stable_duration / self.sensor1_loop_delay)): + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + + if not response: + stable_count = 0 + else: + status_code = self.parse_status_code(response) + if status_code in self.required_codes: + stable_count += 1 + if stable_count >= self.sensor_max_attempts: + return True + else: + stable_count = 0 + time.sleep(self.sensor1_loop_delay) + return False + + def is_valid_sensor_signal_stable(self, sensor_name, detection_duration=3.0, stability_duration=2.5, check_interval=0.1): + """ + 检测在指定时间窗口内是否存在持续稳定的有效信号 + 参数: + sensor_name: 传感器名称 + detection_duration: 总检测时间窗口(秒),默认为3秒 + stability_duration: 信号需要持续稳定的时间(秒),默认为2.5秒 + check_interval: 检测间隔(秒),默认为0.1秒 + + 返回: + True: 在时间窗口内检测到持续稳定的有效信号 + False: 未检测到持续稳定的有效信号 + """ + stable_start_time = None # 记录首次检测到有效信号的时间 + start_time = time.time() + if not self.is_valid_sensor(sensor_name): + return False # 传感器状态无效,返回 + else: + stable_start_time = time.time() # 首次检测到有效信号 + time.sleep(check_interval) + + while time.time() - start_time < detection_duration: + temp_is_valid = self.is_valid_sensor(sensor_name) + if temp_is_valid: + if time.time() - stable_start_time >= stability_duration: + return True # 信号持续稳定达到要求时间 + else: + stable_start_time = time.time() # 信号不稳定,重置计时 + time.sleep(check_interval) + return False + + def is_valid_sensor_status_1(self, sensor_name): + stable_count = 0 + for _ in range(int(self.sensor_stable_duration / self.sensor2_loop_delay)): + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + + if not response: + print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + stable_count = 0 + else: + status_code = self.parse_status_code(response) + if status_code in self.required_codes_1: + stable_count += 1 + if stable_count >= self.sensor_max_attempts: + return True + else: + stable_count = 0 + time.sleep(self.sensor2_loop_delay) + return False + + def is_valid_sensor2_status_lost(self, sensor_name): + stable_count = 0 + _try_nums=5 # 尝试次数 + for _ in range(_try_nums): + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + + if not response: + print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + stable_count = 0 + else: + status_code = self.parse_status_code(response) + if status_code not in self.required_codes_1: + stable_count += 1 + if stable_count >= self.sensor_max_attempts: + return True + else: + stable_count = 0 + time.sleep(self.sensor2_loop_lost) + return False + + def is_valid_sensor(self,sensor_name): + """ + 检查传感器状态是否有效 + 参数: + sensor_name: 传感器名称 + 返回: + True: 传感器状态有效 + False: 传感器状态无效 + """ + stable_count = 0 + _try_nums=5 # 尝试次数 + for _ in range(_try_nums): + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + + if not response: + print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + return False + else: + temp_status_code = self.parse_status_code(response) + if temp_status_code in self.required_codes_1: + stable_count += 1 + if stable_count >= 3: + return True + else: + stable_count = 0 + time.sleep(self.sensor2_loop_lost) + return False + + def is_valid_sensor_stable(self,sensor_name): + """ + 检查传感器状态是否有效 + 参数: + sensor_name: 传感器名称 + 返回: + True: 传感器状态有效 + False: 传感器状态无效 + """ + if not self.is_valid_sensor(sensor_name): + return False + #需要增加超时时间,否则会一直等待 + stable_count = 0 + _try_nums=10 # 尝试次数 + for _ in range(_try_nums): + + responses = self.get_all_sensor_responses('sensors') + response = responses.get(sensor_name) + if response: + temp_status_code = self.parse_status_code(response) + if temp_status_code in self.required_codes_1: + stable_count += 1 + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}:检测到信号,已检测 {stable_count} 次") + if stable_count >= 8: + return True + else: + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}:未检测到信号,已检测 {stable_count} 次") + else: + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}:[警告] 无法获取 {sensor_name} 的响应,尝试重试...") + # else: + # stable_count = 0 + time.sleep(self.sensor2_loop_delay) + return False + +if __name__ == "__main__": + # logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + # 配置日志同时输出到控制台与文件 + log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + file_handler = logging.FileHandler('relay_controller.log', encoding='utf-8') + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(log_formatter) + + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + console_handler.setFormatter(log_formatter) + + logger = logging.getLogger() + logger.setLevel(logging.INFO) + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + relay_controller = RelayController() + _count=0 + while True: + responses = relay_controller.get_all_sensor_responses('sensors') + response = responses.get('sensor2') + if response: + temp_status_code = relay_controller.parse_status_code(response) + if temp_status_code in relay_controller.required_codes_1: + _count+=1 + logger.info(f"检测到信号,连续 {_count} 次") + else: + _count=0 + logger.info(f"未检测到信号") + else: + logger.info(f"[警告] 无法获取响应") + time.sleep(0.2) \ No newline at end of file diff --git a/EMV/EMV_old_save.py b/EMV/EMV_old_save.py deleted file mode 100644 index b3c3d48..0000000 --- a/EMV/EMV_old_save.py +++ /dev/null @@ -1,401 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import socket -import binascii -import time -import threading -import logging -from PySide6.QtCore import Signal, QObject -import numpy as np - -class RelayController: - need_origin_signal = Signal(str) - take_no_photo_sigal = Signal() - update_detect_image = Signal(np.ndarray) - log_signal = Signal(int, str) - def __init__(self, host='192.168.0.18', port=50000): - self.host = host - self.port = port - # 控件映射 - self.CONVEYOR1 = 'conveyor1' - self.PUSHER = 'pusher' - self.CONVEYOR2 = 'conveyor2' - self.CLAMP = 'clamp' - self.PUSHER1 = 'pusher1' - self.SENSOR1 = 'sensor1' - self.SENSOR2 = 'sensor2' - - self.valve_commands = { - self.CONVEYOR1: {'open': '00000000000601050000FF00', 'close': '000000000006010500000000'}, - self.PUSHER: {'open': '00000000000601050001FF00', 'close': '000000000006010500010000'}, - #self.CONVEYOR2: {'open': '00000000000601050002FF00', 'close': '000000000006010500020000'}, - self.CONVEYOR2: {'open': '000100000006020620000012', 'close': '000100000006020620000001'}, - self.CLAMP: {'open': '00000000000601050003FF00', 'close': '000000000006010500030000'}, - self.PUSHER1: {'open': '00000000000601050004FF00', 'close': '000000000006010500040000'}# - } - - self.read_status_command = { - 'devices': '000000000006010100000008', - 'sensors': '000000000006010200000008' - } - - - self.device_bit_map = { - self.CONVEYOR1: 0, - self.PUSHER: 1, - self.CONVEYOR2: 2, - self.CLAMP: 3, - self.PUSHER1: 4, - } - - self.sensor_bit_map = { - self.SENSOR1: 0, - self.SENSOR2: 1,# - } - - self.device_name_map = { - self.CONVEYOR1: "传送带1", - self.PUSHER: "推板开", - self.CONVEYOR2: "传送带2", - self.CLAMP: "机械臂夹爪", - self.PUSHER1: "推板关", - } - - self.sensor_name_map = { - self.SENSOR1: '位置传感器1', - self.SENSOR2: '位置传感器2', - } - - # 传感器状态变量 - self._running = False - self._sensor1_thread = None - self._sensor2_thread = None - - # 配置项 - self.required_codes = {'0101', '0103'} # 有效状态码 - self.required_codes_1 = { '0102', '0103'} # 有效状态码(需要修改) - self.stable_duration = 1.0 # 稳定检测时间(秒) - self.max_attempts = 3 # 连续检测次数 - self.poll_interval = 0.2 # 检测间隔 - - # 状态锁和防抖 - self.sensor1_triggered = False - self.sensor1_last_time = 0 - self.sensor1_debounce = 2.0 - - # 传感器2状态变量 - self.sensor2_ready = True - self.motor_stopped_by_sensor2 = False - - def send_command(self, command_hex, retry_count=2, source='unknown'): - byte_data = binascii.unhexlify(command_hex) - for attempt in range(retry_count): - try: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - sock.settimeout(10) - sock.connect((self.host, self.port)) - sock.send(byte_data) - response = sock.recv(1024) - hex_response = binascii.hexlify(response).decode('utf-8') - #if source == 'sensor': - #print(f"[传感器响应] {hex_response}") - #elif source == 'device': - #print(f"[设备控制响应] {hex_response}") - #else: - #print(f"[通信响应] {hex_response}") - return response - except Exception as e: - print(f"通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") - time.sleep(5) - self.trigger_alarm() - return None - - def trigger_alarm(self): - print("警告:连续多次通信失败,请检查设备连接!") - - def get_all_device_status(self, command_type='devices'): - command = self.read_status_command.get(command_type) - if not command: - print(f"未知的读取类型: {command_type}") - return {} - - source = 'sensor' if command_type == 'sensors' else 'device' - response = self.send_command(command, source=source) - status_dict = {} - - if response and len(response) >= 10: - status_byte = response[9] - status_bin = f"{status_byte:08b}"[::-1] - - bit_map = self.device_bit_map if command_type == 'devices' else self.sensor_bit_map - name_map = self.device_name_map if command_type == 'devices' else self.sensor_name_map - - for key, bit_index in bit_map.items(): - status_dict[key] = status_bin[bit_index] == '1' - else: - print(f"[{command_type}] 读取状态失败或响应无效") - - return status_dict - - def get_all_sensor_responses(self, command_type='sensors'): - """ - 获取所有传感器的原始 Modbus 响应字符串 - 示例:{'sensor1': '00000000000401020101', 'sensor2': '00000000000401020100'} - """ - command = self.read_status_command.get(command_type) - if not command: - print(f"未知的读取类型: {command_type}") - return {} - - source = 'sensor' if command_type == 'sensors' else 'device' - response = self.send_command(command, source=source) - responses = {} - - if response and len(response) >= 10: - hex_response = binascii.hexlify(response).decode('utf-8') - print(f"[原始响应][{command_type}] {hex_response}") - - # 假设传感器数据从第 9 字节开始,长度为 2 字节 - for name, bit_index in self.sensor_bit_map.items(): - offset = 9 + (bit_index // 8) - bit_pos = bit_index % 8 - byte = response[offset] - status = (byte >> bit_pos) & 1 - responses[name] = hex_response - else: - print(f"[{command_type}] 无法获取响应数据") - return responses - - def parse_status_code(self, response): - """ - 从 Modbus 响应字符串中提取状态码(后两位) - 示例:00000000000401020101 -> '01' - """ - if isinstance(response, str) and len(response) >= 18: - return response[16:20] - return None - - def is_valid_sensor_status(self, sensor_name: object) -> object: - """ - 检查传感器是否在稳定时间内连续返回有效状态码(01 或 03) - """ - stable_count = 0 - for _ in range(int(self.stable_duration / self.poll_interval)): - responses = self.get_all_sensor_responses('sensors') - response = responses.get(sensor_name) - - if not response: - print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") - stable_count = 0 - else: - status_code = self.parse_status_code(response) - if status_code in self.required_codes: - stable_count += 1 - if stable_count >= self.max_attempts: - return True - else: - stable_count = 0 - print(f"[警告] {sensor_name} 状态码无效: {status_code}") - time.sleep(self.poll_interval) - return False - - def is_valid_sensor_status_1(self, sensor_name: object) -> object: - """ - 检查传感器是否在稳定时间内连续返回有效状态码(01 或 03) - """ - stable_count = 0 - for _ in range(int(self.stable_duration / self.poll_interval)): - responses = self.get_all_sensor_responses('sensors') - response = responses.get(sensor_name) - - if not response: - print(f"[警告] 无法获取 {sensor_name} 的响应,尝试重试...") - stable_count = 0 - else: - status_code = self.parse_status_code(response) - if status_code in self.required_codes_1: - stable_count += 1 - if stable_count >= self.max_attempts: - return True - else: - stable_count = 0 - print(f"[警告] {sensor_name} 状态码无效: {status_code}") - time.sleep(self.poll_interval) - return False - - - def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False): - status = self.get_all_device_status() - if conveyor1 and not status.get(self.CONVEYOR1, False): - print("打开传送带1") - self.send_command(self.valve_commands[self.CONVEYOR1]['open'], source='device') - time.sleep(1) - - if pusher and not status.get(self.PUSHER, False): - print("打开推板") - self.send_command(self.valve_commands[self.PUSHER]['open'], source='device') - time.sleep(0.05) - - if conveyor2 and not status.get(self.CONVEYOR2, False): - print("打开传送带2") - self.send_command(self.valve_commands[self.CONVEYOR2]['open'], source='device') - time.sleep(1) - - if clamp and not status.get(self.CLAMP, False): - print("启动机械臂抓夹") - self.send_command(self.valve_commands[self.CLAMP]['open'], source='device') - time.sleep(0.5) - - if pusher1 and not status.get(self.PUSHER1, False): - print("关闭推板") - self.send_command(self.valve_commands[self.PUSHER1]['open'], source='device') - time.sleep(0.05) - - - def close(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False, pusher1=False): - status = self.get_all_device_status() - if conveyor1 : - #if conveyor1 and status.get(self.CONVEYOR1, True): - print("关闭传送带1") - self.send_command(self.valve_commands[self.CONVEYOR1]['close'], source='device') - time.sleep(1) - - if pusher : - #if pusher and status.get(self.PUSHER, True): - print("关闭推板") - self.send_command(self.valve_commands[self.PUSHER]['close'], source='device') - time.sleep(0.05) - - if conveyor2 : - #if conveyor2 and status.get(self.CONVEYOR2, True): - print("关闭传送带2") - self.send_command(self.valve_commands[self.CONVEYOR2]['close'], source='device') - time.sleep(1) - - if clamp : - #if clamp and status.get(self.CLAMP, True): - print("停止机械臂抓夹") - self.send_command(self.valve_commands[self.CLAMP]['close'], source='device') - time.sleep(0.5) - - if pusher1 : - #if pusher and status.get(self.PUSHER1, True): - print("关闭推板_1") - self.send_command(self.valve_commands[self.PUSHER1]['close'], source='device') - time.sleep(0.05) - - def handle_sensor1(self): - while self._running: - try: - # 检查传感器是否返回有效状态码(01 或 03) - if self.is_valid_sensor_status(self.SENSOR1): - current_time = time.time() - # 判断是否已触发 或 是否在防抖时间内 - if not self.sensor1_triggered and (current_time - self.sensor1_last_time) > self.sensor1_debounce: - print("✅ SENSOR1 检测到有效信号,开始执行推料流程") - # 标记已触发,防止重复执行 - self.sensor1_triggered = True - self.sensor1_last_time = current_time - # 1. 停止包装机皮带电机(关闭) - self.close(conveyor1=True) - time.sleep(0.5) - # 2. 推板开启 - self.open(pusher=True) - time.sleep(0.1) - self.close(pusher=True) - # 2结束 - time.sleep(3) # 保持 3 秒 - # 3. 包装机皮带电机开启 - self.open(conveyor1=True) - time.sleep(0.5) - # 4. 推板关闭 - #self.close(pusher=True) - self.open(pusher1=True) - time.sleep(0.1) - self.close(pusher1=True) - time.sleep(1) - # 5. 状态检查(可选) - status = self.get_all_device_status() - if status.get('conveyor1') and not status.get('pusher'): - print("🟢流程完成1:皮带运行中,推板已收回") - else: - print("⚠️ 状态异常,请检查设备") - # 流程结束,重置触发标志 - self.sensor1_triggered = False - # 如果传感器无效,确保触发标志可重置(可选) - time.sleep(0.2) - - except Exception as e: - print(f"SENSOR1 处理错误: {e}") - self.sensor1_triggered = False - time.sleep(1) - - - #传感器2检测到料包 → 立即停止 conveyor2」这个逻辑 放在传感器线程中处理 - def handle_sensor2(self): - while self._running: - try: - # 检测传感器2状态 - #self.sensor2_ready = None - if self.is_valid_sensor_status_1(self.SENSOR2): - print("✅ SENSOR2 检测到有效信号,开始执行关闭滚筒电机流程") - if not self.sensor2_ready: - #self.log_signal.emit(logging.INFO, "🟢 传感器2检测到料包到位,立即停止 conveyor2") - # ✅ 立即停止电机(不管机器人是否在抓取) - self.close(conveyor2=True) - print("执行关闭") - self.motor_stopped_by_sensor2 = True # 标记为传感器2触发停止 - self.sensor2_ready = True - else: - if self.sensor2_ready and self.motor_stopped_by_sensor2: - #self.log_signal.emit(logging.INFO, "🟡 传感器2未检测到料包,准备重新启动 conveyor2") - # ✅ 重新启动 conveyor2(可选) - self.open(conveyor2=True) - self.motor_stopped_by_sensor2 = False - self.sensor2_ready = False - - time.sleep(0.5) - except Exception as e: - self.log_signal.emit(logging.ERROR, f"🔴 SENSOR2 处理错误: {e}") - time.sleep(1) - def start(self): - if self._running: - print("线程已经在运行") - return - print("启动传感器线程") - self._running = True - self._sensor1_thread = threading.Thread(target=self.handle_sensor1, daemon=True) - self._sensor2_thread = threading.Thread(target=self.handle_sensor2, daemon=True) - self._sensor1_thread.start() - self._sensor2_thread.start() - - def stop(self): - if not self._running: - print("线程未在运行") - return - print("停止传感器线程") - self._running = False - if self._sensor1_thread: - self._sensor1_thread.join() - if self._sensor2_thread: - self._sensor2_thread.join() - print("传感器线程已终止。") - - def start_sensor1_only(self): - if self._running: - print("传感器线程已经在运行") - return - print("启动传感器1监听线程...") - self._running = True - self._sensor1_thread = threading.Thread(target=self.handle_sensor1, daemon=True) - self._sensor1_thread.start() - - -if __name__ == '__main__': - controller = RelayController() - controller.start() - try: - while True: - time.sleep(1) - except KeyboardInterrupt: - controller.stop() \ No newline at end of file diff --git a/EMV/EMV_reneer_pengqi_save.py b/EMV/EMV_reneer_pengqi_save.py deleted file mode 100644 index 3fe94d9..0000000 --- a/EMV/EMV_reneer_pengqi_save.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import socket -import binascii -import time -import threading - -class RelayController: - def __init__(self, host='192.168.0.18', port=50000): - self.host = host - self.port = port - - # 控件映射 - self.CONVEYOR1 = 'conveyor1' - self.PUSHER = 'pusher' - self.CONVEYOR2 = 'conveyor2' - self.CLAMP = 'clamp' - self.SENSOR1 = 'sensor1' - self.SENSOR2 = 'sensor2' - - self.valve_commands = { - self.CONVEYOR1: {'open': '00000000000601050000FF00', 'close': '000000000006010500000000'}, - self.PUSHER: {'open': '00000000000601050001FF00', 'close': '000000000006010500010000'}, - self.CONVEYOR2: {'open': '00000000000601050002FF00', 'close': '000000000006010500020000'}, - self.CLAMP: {'open': '00000000000601050003FF00', 'close': '000000000006010500030000'} - } - - self.read_status_command = { - 'devices': '000000000006010100000008', - 'sensors': '000000000006010200000008' - } - - self.device_bit_map = { - self.CONVEYOR1: 0, - self.PUSHER: 1, - self.CONVEYOR2: 2, - self.CLAMP: 3, - } - - self.sensor_bit_map = { - self.SENSOR1: 0, - self.SENSOR2: 1, - } - - self.device_name_map = { - self.CONVEYOR1: "传送带1", - self.PUSHER: "推板", - self.CONVEYOR2: "传送带2", - self.CLAMP: "机械臂" - } - - self.sensor_name_map = { - self.SENSOR1: '位置传感器1', - self.SENSOR2: '位置传感器2', - } - - self._running = False - self._sensor1_thread = None - self._sensor2_thread = None - - def send_command_old(self, command_hex): - byte_data = binascii.unhexlify(command_hex) - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - try: - sock.connect((self.host, self.port)) - sock.send(byte_data) - response = sock.recv(1024) - print(f"收到响应: {binascii.hexlify(response)}") - return response - except Exception as e: - print(f"通信错误: {e}") - return None - - def start_sensor1_only(self): - if self._running: - print("线程已经在运行") - return - print("启动传感器1监听线程") - self._running = True - self._sensor1_thread = threading.Thread(target=self.handle_sensor1, daemon=True) - self._sensor1_thread.start() - - def send_command(self, command_hex, retry_count=5, source='unknown'): - byte_data = binascii.unhexlify(command_hex) - for attempt in range(retry_count): - try: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - sock.settimeout(10) - sock.connect((self.host, self.port)) - sock.send(byte_data) - response = sock.recv(1024) - hex_response = binascii.hexlify(response).decode('utf-8') - - # 根据 source 区分响应来源 - if source == 'sensor': - print(f"[传感器响应] {hex_response}") - elif source == 'device': - print(f"[设备控制响应] {hex_response}") - else: - print(f"[通信响应] {hex_response}") - - return response - except Exception as e: - print(f"通信错误 ({source}): {e}, 尝试重连... ({attempt + 1}/{retry_count})") - if attempt == retry_count - 1: - self.trigger_alarm() - time.sleep(5) - return None - - def trigger_alarm(self): - """当通信错误超过最大重试次数时触发报警""" - print("警告:连续多次通信失败,请检查设备连接!") - # 这里可以添加更多的报警措施,如发送邮件、短信或声音警报等 - - def get_all_device_status(self, command_type='devices'): - command = self.read_status_command.get(command_type) - if not command: - print(f"未知的读取类型: {command_type}") - return {} - - # 设置来源标识 - source = 'sensor' if command_type == 'sensors' else 'device' - - response = self.send_command(command, source=source) - status_dict = {} - - if response and len(response) >= 10: - status_byte = response[9] - status_bin = f"{status_byte:08b}"[::-1] - - bit_map = self.device_bit_map if command_type == 'devices' else self.sensor_bit_map - name_map = self.device_name_map if command_type == 'devices' else self.sensor_name_map - - for key, bit_index in bit_map.items(): - status_dict[key] = status_bin[bit_index] == '1' - else: - print(f"[{command_type}] 读取状态失败或响应无效") - - return status_dict - - def get_device_status_old(self, name, command_type='devices'): - return self.get_all_device_status(command_type).get(name, None) - - def get_device_status(self, name, command_type='devices', stable_duration=1.0, max_attempts=3): - """ - 获取指定设备/传感器的状态,只有在连续稳定检测到信号后才返回 True。 - - 参数: - name (str): 设备/传感器名称,如 SENSOR1 - command_type (str): 类型,'devices' 或 'sensors' - stable_duration (float): 信号需要稳定的持续时间(秒) - max_attempts (int): 最大尝试次数(用于稳定性判断) - - 返回: - bool or None: 稳定检测到信号返回 True,否则返回 False 或 None(失败) - """ - stable_count = 0 - interval = 0.2 # 每隔多久检查一次 - - for _ in range(int(stable_duration / interval)): - statuses = self.get_all_device_status(command_type) - status = statuses.get(name) - - if status is True: - stable_count += 1 - if stable_count >= max_attempts: - return True - elif status is False: - return False - else: - # None 表示读取失败 - print(f"[警告] 读取 {name} 状态失败,尝试重试...") - stable_count = 0 - - time.sleep(interval) - - return False # 默认返回 False,避免误触发 - - def open(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False): - status = self.get_all_device_status() - if conveyor1 and not status.get(self.CONVEYOR1, False): - print("打开传送带1") - self.send_command(self.valve_commands[self.CONVEYOR1]['open'], source='device') - time.sleep(1) - - if pusher and not status.get(self.PUSHER, False): - print("打开推板") - self.send_command(self.valve_commands[self.PUSHER]['open'], source='device') - time.sleep(0.05) - - if conveyor2 and not status.get(self.CONVEYOR2, False): - print("打开传送带2") - self.send_command(self.valve_commands[self.CONVEYOR2]['open'], source='device') - time.sleep(1) - - if clamp and not status.get(self.CLAMP, False): - print("启动机械臂抓夹") - self.send_command(self.valve_commands[self.CLAMP]['open'], source='device') - time.sleep(0.5) - - def close(self, conveyor1=False, pusher=False, conveyor2=False, clamp=False): - status = self.get_all_device_status() - if conveyor1 and status.get(self.CONVEYOR1, True): - print("关闭传送带1") - self.send_command(self.valve_commands[self.CONVEYOR1]['close'], source='device') - time.sleep(1) - - if pusher and status.get(self.PUSHER, True): - print("关闭推板") - self.send_command(self.valve_commands[self.PUSHER]['close'], source='device') - time.sleep(0.05) - - if conveyor2 and status.get(self.CONVEYOR2, True): - print("关闭传送带2") - self.send_command(self.valve_commands[self.CONVEYOR2]['close'], source='device') - time.sleep(1) - - if clamp and status.get(self.CLAMP, True): - print("停止机械臂抓夹") - self.send_command(self.valve_commands[self.CLAMP]['close'], source='device') - time.sleep(0.5) - - def handle_sensor1(self): - while self._running: - try: - if self.get_device_status(self.SENSOR1, 'sensors'): - print("SENSOR1 检测到信号,执行流程") - self.close(conveyor1=True) - time.sleep(2) - self.open(pusher=True) - time.sleep(5) - self.close(pusher=True) - time.sleep(2) - self.open(conveyor1=True) - time.sleep(0.5) - except Exception as e: - print(f"SENSOR1 处理错误: {e}") - - def handle_sensor2(self): - while self._running: - try: - if self.get_device_status(self.SENSOR2, 'sensors'): - print("SENSOR2 检测到信号,执行流程") - self.close(conveyor2=True) - time.sleep(2) - self.open(clamp=True) - time.sleep(2) - self.open(conveyor2=True) - time.sleep(0.5) - except Exception as e: - print(f"SENSOR2 处理错误: {e}") - - def start(self): - if self._running: - print("线程已经在运行") - return - print("启动传感器线程") - self._running = True - self._sensor1_thread = threading.Thread(target=self.handle_sensor1, daemon=True) - self._sensor2_thread = threading.Thread(target=self.handle_sensor2, daemon=True) - self._sensor1_thread.start() - self._sensor2_thread.start() - - def stop(self): - if not self._running: - print("线程未在运行") - return - print("停止传感器线程") - self._running = False # 设置标志位为 False - if self._sensor1_thread is not None: - self._sensor1_thread.join() # 等待线程结束 - if self._sensor2_thread is not None: - self._sensor2_thread.join() - print("传感器线程已终止。") \ No newline at end of file diff --git a/EMV/all_sensors_device_test.py b/EMV/all_sensors_device_test.py index 90fcf30..74fc624 100644 --- a/EMV/all_sensors_device_test.py +++ b/EMV/all_sensors_device_test.py @@ -4,6 +4,7 @@ import sys sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from EMV import RelayController import time +from datetime import datetime import threading relay_controller = RelayController() # 实例化控制器 @@ -97,17 +98,39 @@ if __name__ == "__main__": # sensors = relay_controller.get_all_device_status() # print(sensors) # time.sleep(3) - # test_device('conveyor2', 'open') + while True: + test_device('conveyor2', 'open') + # test_device('belt', 'close') + # time.sleep(3) + test_device('conveyor2', 'close') # test_device('belt', 'close') - # time.sleep(3) - # test_device('conveyor2', 'open') - # test_device('belt', 'close') - # sensors = relay_controller.get_all_device_status('sensors') - # sensor2_value = sensors.get(relay_controller.SENSOR2, False) + + + # while True: + # responses = relay_controller.get_all_sensor_responses('sensors') + # response = responses.get(relay_controller.SENSOR2) + + # if not response: + # print(f"[警告] 无法获取 {relay_controller.SENSOR2} 的响应,尝试重试...") + + # else: + # status_code = relay_controller.parse_status_code(response) + # if status_code in relay_controller.required_codes_1: + # print(datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]+'收到有效状态码信号') + # else: + # print(datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]+'无效状态码信号') + # time.sleep(0.2) + + # relay_controller._running=True + # relay_controller.sensor2_ready=True # relay_controller.handle_sensor2() - test_device('blow_sensor2', 'close') + # test_device('blow_sensor2', 'open') + + + + # test_device('blow_sensor2', 'close') # while True: @@ -132,7 +155,7 @@ if __name__ == "__main__": # relay_controller._running=True # relay_controller.handle_emergency_pressed() - time.sleep(100) + time.sleep(1000000) print('aaaaa') diff --git a/EMV/only_sensor1_test.py b/EMV/only_sensor1_test.py deleted file mode 100644 index 53bfd66..0000000 --- a/EMV/only_sensor1_test.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import time -from EMV import RelayController # 请根据你的实际模块名修改 - -def run_real_sensor_monitor(): - # 创建控制器实例 - controller = RelayController() - - try: - print("启动传感器1监听线程...") - controller.start_sensor1_only() # 只启动传感器1的监听线程 - - print("开始监听真实传感器1信号,按 Ctrl+C 停止...") - - # 主线程可以继续做其他事情,或者只是等待 - while True: - time.sleep(1) # 保持主线程运行 - - except KeyboardInterrupt: - print("\n检测到中断信号,正在停止传感器监听...") - finally: - controller.stop() - print("程序已安全退出。") - - -if __name__ == '__main__': - run_real_sensor_monitor() \ No newline at end of file diff --git a/EMV/sensors_test.py b/EMV/sensors_test.py deleted file mode 100644 index 60bfe57..0000000 --- a/EMV/sensors_test.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import time -import logging -from threading import Thread -from unittest.mock import patch - -# 假设你的 RelayController 类在名为 EMV 的模块中 -from EMV import RelayController # 替换为你的模块名 - -# 设置日志格式 -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') - -def simulate_sensor(controller, sensor_name, active=True, duration=10): - """ - 模拟指定传感器在一段时间内处于激活状态。 - :param controller: RelayController 实例 - :param sensor_name: 要模拟的传感器名(如 controller.SENSOR2) - :param active: 是否激活传感器信号 - :param duration: 模拟运行时间(秒) - """ - logging.info(f"🧪 开始模拟传感器:{controller.sensor_name_map.get(sensor_name, sensor_name)}") - original_method = controller.get_all_device_status - - def mock_get_all_device_status(command_type='devices'): - if command_type == 'sensors': - all_status = original_method(command_type) - all_status[sensor_name] = active - return all_status - return original_method(command_type) - - # 确定目标函数 - target_func = None - if sensor_name == controller.SENSOR1: - target_func = controller.handle_sensor1 - elif sensor_name == controller.SENSOR2: - target_func = controller.handle_sensor2 - else: - raise ValueError("不支持的传感器名称") - - # 设置 _running 为 True,确保线程能进入循环 - controller._running = True - - # 启动线程 - sensor_thread = Thread(target=target_func, daemon=True) - sensor_thread.start() - logging.info(f"✅ {controller.sensor_name_map[sensor_name]} 监听线程已启动") - - try: - # Patch get_all_device_status 方法 - with patch.object(controller, 'get_all_device_status', mock_get_all_device_status): - logging.info(f"🟢 模拟 {controller.sensor_name_map[sensor_name]} 有信号输入,持续 {duration} 秒") - time.sleep(duration) - except Exception as e: - logging.error(f"🔴 模拟过程中发生错误: {e}") - finally: - # 停止控制器 - controller._running = False - logging.info("🛑 停止控制器主循环") - # 等待线程退出 - sensor_thread.join(timeout=2) - if sensor_thread.is_alive(): - logging.warning("⚠️ 传感器线程未能及时退出") - else: - logging.info("✅ 传感器线程已安全退出") - -if __name__ == '__main__': - # 创建控制器实例 - relay_controller = RelayController() - - # 打印当前配置的传感器名称映射(方便调试) - logging.info("🔧 当前传感器配置:") - for key, val in relay_controller.sensor_name_map.items(): - logging.info(f" {key}: {val}") - - try: - # 模拟 SENSOR2 有信号输入,运行 10 秒 - logging.info("🧪 开始模拟传感器2")#修改这里 - simulate_sensor(relay_controller, relay_controller.SENSOR1, active=True, duration=10)# - - # 可选:模拟 SENSOR1 - # logging.info("🧪 开始模拟传感器1") - # simulate_sensor(relay_controller, relay_controller.SENSOR1, active=True, duration=10) - - except KeyboardInterrupt: - logging.info("🛑 用户中断模拟") - finally: - logging.info("🏁 模拟结束") \ No newline at end of file diff --git a/MainWin.ui b/MainWin.ui deleted file mode 100644 index 99cbd9f..0000000 --- a/MainWin.ui +++ /dev/null @@ -1,6057 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 995 - 733 - - - - - 0 - 0 - - - - 爱来米业 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - background-color: #0D1128; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - border-image: url(:/main/Image/title_ico.png) 0 0 0 0 strech; -border-width: 5px 1px 3px 4px; -border-style: solid; - - - - - - false - - - - - - - - 0 - 0 - - - - color: #DBF4F5; -font: 700 12pt "Microsoft YaHei UI"; - - - 爱来米业码垛系统 - - - - - - - - - - - 0 - 0 - - - - background-color: rgb(16, 21, 49); -border: 1px solid #122041; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - QLayout::SizeConstraint::SetDefaultConstraint - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - -*{ -color:#3479BE; -background-color: #111633; -font: 12pt "Microsoft YaHei UI"; -border: 1px; -padding:18px; - -} -*:hover{ -color:#ffffff; -border-image: url(:/main/Image/backgroud_head_btn.jpg); -background-color: #1A3E79; -} -*:pressed -{ -color:#ffffff; -border-image: url(:/main/Image/backgroud_head_btn.jpg); -background-color: #1A3E79; -} - - - - 投料中心 - - - - - - - - 0 - 0 - - - - -*{ -color:#3479BE; -background-color: #111633; -font: 12pt "Microsoft YaHei UI"; -border: 1px; -padding:18px; - -} -*:pressed -{ -color:#ffffff; -border-image: url(:/main/Image/backgroud_head_btn.jpg); -background-color: #1A3E79; -} - - - - 捏合中心 - - - - - - - - 0 - 0 - - - - -*{ -color:#3479BE; -background-color: #111633; -font: 12pt "Microsoft YaHei UI"; -border: 1px; -padding:18px; - -} -*:pressed -{ -color:#ffffff; -border-image: url(:/main/Image/backgroud_head_btn.jpg); -background-color: #1A3E79; -} - - - - 成品 - - - - - - - - 0 - 0 - - - - -*{ -color:#3479BE; -background-color: #111633; -font: 12pt "Microsoft YaHei UI"; -border: 1px; -padding:18px; - -} -*:pressed -{ -color:#ffffff; -border-image: url(:/main/Image/backgroud_head_btn.jpg); -background-color: #1A3E79; -} - - - - 控制中心 - - - - - - - - - - - 0 - 0 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - *{ -color:#838992; -background-color: #1B1F34; -font: 9pt "Microsoft YaHei UI"; -border: 1px solid #282B40; -} -*:pressed -{ -color:#ffffff; -background-color: #1A3E79; -} - - - - 登录 - - - - :/main/Image/login.svg:/main/Image/login.svg - - - - - - - - 0 - 0 - - - - *{ -color:#838992; -background-color: #1B1F34; -font: 9pt "Microsoft YaHei UI"; -border: 1px solid #282B40; -} -*:pressed -{ -color:#ffffff; -background-color: #1A3E79; -} - - - - 退出 - - - - :/main/Image/logout.svg:/main/Image/logout.svg - - - - - - - - - - - - - background-color: #0D1128; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - background-color: #0D1128; -border: 1px solid #324C82; - - - - 8 - - - QLayout::SizeConstraint::SetDefaultConstraint - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - background-color: #0D1128; -border: none; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - QPushButton { - - color: white; /* 按钮文本颜色 */ - background-color: rgb(25, 30, 54); - padding: 10px ; /* 按钮内边距 */ - font: 12pt "Microsoft YaHei UI"; - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn.jpg); - } - - - 系统设置 - - - - :/main/Image/icon_leftMenu_btn_sys.svg:/main/Image/icon_leftMenu_btn_sys.svg - - - - 20 - 20 - - - - - - - - - 0 - 0 - - - - -background-color: rgb(13, 17, 40); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - background-color: rgb(13, 17, 40); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - - - QPushButton { - - background-color: rgb(16, 31, 63); - color: rgb(255, 255, 255); - - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); - - } -*:pressed -{ -border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); -} - - - - 生产界面 - - - - - - - - 0 - 0 - - - - - - QPushButton { - - background-color: rgb(16, 31, 63); - color: rgb(255, 255, 255); - - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); - - } -*:pressed -{ -border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); -} - - - - 机械臂基础设置 - - - - - - - - 0 - 0 - - - - - - QPushButton { - - background-color: rgb(16, 31, 63); - color: rgb(255, 255, 255); - - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); - - } -*:pressed -{ -border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); -} - - - - IO面板 - - - - - - - - 0 - 0 - - - - - - QPushButton { - - background-color: rgb(16, 31, 63); - color: rgb(255, 255, 255); - - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); - - } -*:pressed -{ -border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); -} - - - - 位置设定 - - - - - - - - 0 - 0 - - - - - - QPushButton { - - background-color: rgb(16, 31, 63); - color: rgb(255, 255, 255); - - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); - - } -*:pressed -{ -border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); -} - - - - 基础设置 - - - - - - - - 0 - 0 - - - - - - QPushButton { - - background-color: rgb(16, 31, 63); - color: rgb(255, 255, 255); - - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); - - } -*:pressed -{ -border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg); -} - - - - 点位调试 - - - - - - - - - - - - - - - - border: none; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - QPushButton { - - color: white; /* 按钮文本颜色 */ - background-color: rgb(25, 30, 54); - padding: 10px ; /* 按钮内边距 */ - font: 12pt "Microsoft YaHei UI"; - } - QPushButton:hover { - border-image: url(:/main/Image/backgroud_leftMenu_btn.jpg); - } - - - 其他设置 - - - - :/main/Image/icon_other.svg:/main/Image/icon_other.svg - - - - 20 - 20 - - - - - - - - -background-color: rgb(13, 17, 40); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - background-color: rgb(13, 17, 40); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 5 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - - - - - - - - - - - 0 - 0 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 3 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - background-color: rgba(255, 255, 255, 0); -border-image: None; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - *{ -background-color: #7A7A7A; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:disabled -{ -background-color: #ff6e00; -} - - - - - - - - - - - - - 0 - 0 - - - - -QLabel:disabled{ - background-color: rgba(255, 255, 255, 0); - font: 700 12pt "Microsoft YaHei UI"; - color: red; -} - -QLabel{ -background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color:#7A7A7A; -} - - - 取料中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - *{ -background-color: #7A7A7A; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:disabled -{ -background-color: #ff6e00; -} - - - - - - - - - - - - - 0 - 0 - - - - -QLabel:disabled{ - background-color: rgba(255, 255, 255, 0); - font: 700 12pt "Microsoft YaHei UI"; - color: red; -} - -QLabel{ -background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color:#7A7A7A; -} - - - 拍照中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - *{ -background-color: #7A7A7A; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:disabled -{ -background-color: #ff6e00; -} - - - - - - - - - - - - - 0 - 0 - - - - -QLabel:disabled{ - background-color: rgba(255, 255, 255, 0); - font: 700 12pt "Microsoft YaHei UI"; - color: red; -} - -QLabel{ -background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color:#7A7A7A; -} - - - 抓料中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - *{ -background-color: #7A7A7A; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:disabled -{ -background-color: #ff6e00; -} - - - - - - - - - - - - - 0 - 0 - - - - -QLabel:disabled{ - background-color: rgba(255, 255, 255, 0); - font: 700 12pt "Microsoft YaHei UI"; - color: red; -} - -QLabel{ -background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color:#7A7A7A; -} - - - 投料中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 0 - 0 - - - - false - - - background-image: url(:/main/Image/wait.png); -background-position: center; -background-repeat: no-repeat; - - - - - - - false - - - - - - - - 0 - 0 - - - - background-color: rgba(255, 255, 255, 0); -color: red; -border-image: None; - - - 正在移动 - - - Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing - - - - - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - border: 1px solid #324C82; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - -QTabBar::tab { - background: #191E36; - padding: 10px; -border:None; - color:#ffffff -} - - - - QTabWidget::TabShape::Rounded - - - 0 - - - Qt::TextElideMode::ElideNone - - - true - - - false - - - false - - - - - :/main/Image/log.svg:/main/Image/log.svg - - - 日志 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - color: rgb(255, 255, 255); - - - - - - - - - :/main/Image/waring.svg:/main/Image/waring.svg - - - 报警 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - -color: rgb(255, 0, 0); - - - - - - - - - - - - - - border: 1px solid #324C82; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - border:None - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 连接状态: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} -QLabel:disabled{ - background-color: #FD3251; - color: #ffffff; - border-radius: 8px; - border: 1px solid #FD3251; - qproperty-alignment: 'AlignCenter'; -} - - - - - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 当前模式: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 自动 - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 远程指令数量: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 0 - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 当前速度: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 0 - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 当前工具号: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 1 - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 报警代码: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 200 - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - font: 700 16pt "Microsoft YaHei UI"; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 40 - - - - - color: rgb(255, 255, 255); - - - Y1 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 2 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 3 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 4 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 5 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 6 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 7 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 8 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 9 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 10 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 11 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 12 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 13 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 14 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 15 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 16 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 17 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 18 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 19 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 20 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 21 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 22 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 23 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 24 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 25 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 26 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 27 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 28 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 29 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 30 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 31 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - color: rgb(255, 255, 255); - - - 32 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - background-color: rgb(0, 170, 0); - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - border:1px solid #324C82; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - color:#ffffff; -border:None; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 80 - - - - - - 0 - 0 - - - - V1: - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - Z1: - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - Y1: - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - U1: - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - X1: - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - W1: - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 获取原点 - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 保存原点 - - - - - - - - - - - - - border:1px solid #324C82; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 12 - - - - - color:#ffffff; -border:None; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 35 - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位2 - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位1 - - - - - - - - 0 - 0 - - - - X2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位4 - - - - - - - - 0 - 0 - - - - Y3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - W2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - U3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位4 - - - - - - - - 0 - 0 - - - - W5: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - Z5: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - V2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - W3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - W1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位5 - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位3 - - - - - - - - 0 - 0 - - - - Y5: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - X3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - V3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - Y2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - V5: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - V1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位5 - - - - - - - - 0 - 0 - - - - Z3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - X5: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - X4: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - W4: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - Y1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - Z1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - U2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - Y4: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - X1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - U5: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - U4: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位3 - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - V4: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位1 - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位2 - - - - - - - - 0 - 0 - - - - Z4: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - 0 - 0 - - - - U1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - Z2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - border:1px solid #FFFfff - - - true - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 60 - - - 0 - - - 60 - - - - - - 0 - 0 - - - - *{ -background-color: #2196F3; -font: 20pt "楷体"; -border:None; -color:#ffffff -} -*:pressed -{ -background-color: #499c8a; -} - - - - 保存设置 - - - false - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 抓取点位: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 摇晃点位: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 摇晃延时: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 复位速度: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 生产速度: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 调试速度: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 抓取延时: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 抛袋点位: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 平滑系数: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 抛袋延时: - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); - - - 动态高度: - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - background-color: rgb(85, 170, 255); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - - - - - Qt::Orientation::Horizontal - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J5 - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - - 150 - - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - - - - - Qt::Orientation::Horizontal - - - - - - - - - - - - - - -150 - - - - - - - - - - -150 - - - - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J1 - - - - - - - -150 - - - - - - - -150 - - - - - - - Qt::Orientation::Horizontal - - - - - - - 150 - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(0, 255, 0); -} - - - - - - - - - - - - - - -150 - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - - *{ -background-color: #007AD9; -font: 12pt "楷体"; -border:6px solid #55AAFF; -color:#ffffff -} -*:pressed -{ -background-color: #499c8a; -} - - - - 确定移动 - - - - - - - Qt::Orientation::Horizontal - - - - - - - Qt::Orientation::Horizontal - - - - - - - +10 - - - - - - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - - 150 - - - - - - - - - - - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J6 - - - - - - - - - - 150 - - - - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J3 - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - - - - - - - - - -10 - - - - - - - - - - - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - - - - - - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J2 - - - - - - - 调整间隔: - - - - - - - 150 - - - - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J4 - - - - - - - Qt::Orientation::Horizontal - - - - - - - 1 - - - 0.001-20 - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - color: rgb(255, 255, 255); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - color: rgb(255, 255, 255); -background-color: rgb(0, 85, 0); - - - 保存 - - - - - - - 生产线 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - QHeaderView::section { - background-color: #2C2C2C; /* 表头背景色 */ - color: white; /* 表头字体颜色 */ - font-size: 14px; /* 字体大小 */ - font-weight: bold; /* 字体加粗 */ - border: 1px solid black; /* 边框颜色 */ - padding: 4px; /* 内边距 */ - } - - - - - - - TextLabel - - - Qt::AlignmentFlag::AlignCenter - - - - - - - QHeaderView::section { - background-color: #2C2C2C; /* 表头背景色 */ - color: white; /* 表头字体颜色 */ - font-size: 14px; /* 字体大小 */ - font-weight: bold; /* 字体加粗 */ - border: 1px solid black; /* 边框颜色 */ - padding: 4px; /* 内边距 */ - } - - - - - - - - - - - - - - - - - - 0 - 0 - - - - background-color: rgb(16, 21, 49); -border: 1px solid #122041; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - border-image: url(:/main/Image/calendar.svg); - - - - - - Qt::AlignmentFlag::AlignCenter - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 2024-08-01 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 08:00:00 - - - - - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - QComboBox { - border-radius: 10px; - padding: 5px 5px 5px 5px; - background-color: #2c2c2c; - color: white; - border: 1px solid #474747; - min-width: 80px; -} - - -QComboBox::drop-down { - width: 0px; - border: none; - -} - -QComboBox::down-arrow { - image: none; -} - -QComboBox QAbstractItemView { - border-bottom-right-radius: 10px; - border-bottom-left-radius: 10px; - background-color: #D3D3D3; - border: 1px solid gray; - padding: 4px 4px 4px 4px; - outline: none; -} - - - 1号线 - - - - 1号线 - - - - - 新建线 - - - - - - - - border:none; - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 10 - - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 20 - - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 30 - - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 40 - - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 50 - - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 60 - - - - - - - - 0 - 0 - - - - color: rgb(255, 255, 255); -border: 1px solid #dcdfe6; -font: 8pt "Microsoft YaHei UI"; - - - 从第几包开始 - - - - - - - - 0 - 0 - - - - -*{background-color: #101F3F; -font: 10pt "楷体"; -color:#ffffff -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 确定 - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - *{ -background-color: #499C54; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 补一袋 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: rgb(255, 0, 0); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 扣一袋 - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - 0 - 0 - - - - *{ -background-color: #FFFFBF; -font: 9pt "楷体"; -border-radius: 10px; -} -*:pressed -{ -background-color: #FFF000; -} - - - - 复位 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: #FFF000; -font: 9pt "楷体"; -border-radius: 10px; -} -*:pressed -{ -background-color: #ff6e00; -} - - - - - 急停 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: #FF0000; -font: 9pt "楷体"; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 停止 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: #2196F3; -font: 9pt "楷体"; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 暂停 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: #499C54; -font: 9pt "楷体"; - -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 启动 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: #1CB2B1; -font: 9pt "楷体"; -border-radius: 10px; -} -*:pressed -{ -background-color:#1cb052; -} - - - - - 清除报警 - - - - - - - - - - - 0 - 0 - - - - *{ -background-color: rgb(0, 170, 0); - -font: 9pt "楷体"; -border-radius: 10px; -} -*:pressed -{ -background-color:#1cb052; -} - - - - - 一键投料 - - - - - - - 20 - 20 - - - - - - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - /**QSlider -{ - background-color: #FFFFFF; - border-style: outset; - border-radius:5px; -} - -QSlider::groove:horizontal -{ - height: 10px; - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4); - margin: 10px 0 -} - -QSlider::handle:horizontal -{ - background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green); - width: 10px; - height: 16px; - margin: -5px 3px -5px 6px; - border-radius:5px; - border: 3px solid #007900; -} -**/ -/*第一种风格*/ -/** - groove表示槽的部分 - handle表示滑块 - add-page表示未滑过的槽部分 - sub-page表示已滑过的槽部分 - 在辅助控制器后面可以设置状态,horizontal就是QSS生效的QSlider的状态 -**/ - -QSlider::groove:horizontal -{ - height:10px; - border-radius: 5px; - background-color:rgb(219,219,219); -} - - -QSlider::handle:horizontal -{ - background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green); - width: 5px; - height: 5px; - margin: -5px 3px -5px 6px; - border-radius:5px; - border: 3px solid #007900; -} - -QSlider::add-page:horizontal -{ - border-radius: 5px; - background-color: rgb(219,219,219); -} - -QSlider::sub-page:horizontal -{ - border-radius: 5px; - background-color: rgb(80,166,234); -} - - - - - - - - - Qt::Orientation::Horizontal - - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - color: rgb(255, 255, 255); - - - 码垛袋数: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - color: rgb(255, 0, 0); -font: 36pt "Microsoft YaHei UI"; - - - 0 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - color: rgb(255, 255, 255); - - - 已投袋数: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - color: rgb(0, 255, 0); -font: 36pt "Microsoft YaHei UI"; - - - 0 - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - - - - - - - - - - - - - - ToggleSwitch - QWidget -
toggleswitch.h
- 1 -
-
- - - - -
diff --git a/MainWin_ui.py b/MainWin_ui.py deleted file mode 100644 index 7d9a9f3..0000000 --- a/MainWin_ui.py +++ /dev/null @@ -1,4066 +0,0 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'MainWin.ui' -## -## Created by: Qt User Interface Compiler version 6.7.2 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, - QMetaObject, QObject, QPoint, QRect, - QSize, QTime, QUrl, Qt) -from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, - QFont, QFontDatabase, QGradient, QIcon, - QImage, QKeySequence, QLinearGradient, QPainter, - QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QApplication, QComboBox, QFrame, QGridLayout, - QHBoxLayout, QHeaderView, QLabel, QLayout, - QLineEdit, QMainWindow, QPushButton, QSizePolicy, - QSlider, QStackedWidget, QTabWidget, QTableWidget, - QTableWidgetItem, QTextEdit, QVBoxLayout, QWidget) - -from toggleswitch import ToggleSwitch -import MainRecources_rc - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - if not MainWindow.objectName(): - MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(995, 733) - sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) - MainWindow.setSizePolicy(sizePolicy) - self.centralwidget = QWidget(MainWindow) - self.centralwidget.setObjectName(u"centralwidget") - self.verticalLayout = QVBoxLayout(self.centralwidget) - self.verticalLayout.setSpacing(0) - self.verticalLayout.setObjectName(u"verticalLayout") - self.verticalLayout.setContentsMargins(0, 0, 0, 0) - self.frame_head = QFrame(self.centralwidget) - self.frame_head.setObjectName(u"frame_head") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.frame_head.sizePolicy().hasHeightForWidth()) - self.frame_head.setSizePolicy(sizePolicy1) - self.frame_head.setStyleSheet(u"background-color: #0D1128;") - self.frame_head.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_head.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout = QHBoxLayout(self.frame_head) - self.horizontalLayout.setSpacing(0) - self.horizontalLayout.setObjectName(u"horizontalLayout") - self.horizontalLayout.setContentsMargins(0, 0, 0, 0) - self.frame_4 = QFrame(self.frame_head) - self.frame_4.setObjectName(u"frame_4") - sizePolicy1.setHeightForWidth(self.frame_4.sizePolicy().hasHeightForWidth()) - self.frame_4.setSizePolicy(sizePolicy1) - self.frame_4.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_4.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_2 = QHBoxLayout(self.frame_4) - self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") - self.label = QLabel(self.frame_4) - self.label.setObjectName(u"label") - sizePolicy1.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) - self.label.setSizePolicy(sizePolicy1) - self.label.setStyleSheet(u"border-image: url(:/main/Image/title_ico.png) 0 0 0 0 strech;\n" -"border-width: 5px 1px 3px 4px; \n" -"border-style: solid; ") - self.label.setScaledContents(False) - - self.horizontalLayout_2.addWidget(self.label) - - self.label_2 = QLabel(self.frame_4) - self.label_2.setObjectName(u"label_2") - sizePolicy1.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) - self.label_2.setSizePolicy(sizePolicy1) - self.label_2.setStyleSheet(u"color: #DBF4F5;\n" -"font: 700 12pt \"Microsoft YaHei UI\";") - - self.horizontalLayout_2.addWidget(self.label_2) - - self.horizontalLayout_2.setStretch(0, 2) - self.horizontalLayout_2.setStretch(1, 10) - - self.horizontalLayout.addWidget(self.frame_4) - - self.frame = QFrame(self.frame_head) - self.frame.setObjectName(u"frame") - sizePolicy1.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) - self.frame.setSizePolicy(sizePolicy1) - self.frame.setStyleSheet(u"background-color: rgb(16, 21, 49);\n" -"border: 1px solid #122041;") - self.frame.setFrameShape(QFrame.Shape.StyledPanel) - self.frame.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_3 = QHBoxLayout(self.frame) - self.horizontalLayout_3.setSpacing(0) - self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") - self.horizontalLayout_3.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint) - self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) - self.pushButton = QPushButton(self.frame) - self.pushButton.setObjectName(u"pushButton") - sizePolicy1.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) - self.pushButton.setSizePolicy(sizePolicy1) - self.pushButton.setStyleSheet(u"\n" -"*{\n" -"color:#3479BE;\n" -"background-color: #111633;\n" -"font: 12pt \"Microsoft YaHei UI\";\n" -"border: 1px;\n" -"padding:18px;\n" -"\n" -"}\n" -"*:hover{\n" -"color:#ffffff;\n" -"border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" -"background-color: #1A3E79;\n" -"}\n" -"*:pressed\n" -"{\n" -"color:#ffffff;\n" -"border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" -"background-color: #1A3E79;\n" -"}\n" -"") - - self.horizontalLayout_3.addWidget(self.pushButton) - - self.pushButton_2 = QPushButton(self.frame) - self.pushButton_2.setObjectName(u"pushButton_2") - sizePolicy1.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth()) - self.pushButton_2.setSizePolicy(sizePolicy1) - self.pushButton_2.setStyleSheet(u"\n" -"*{\n" -"color:#3479BE;\n" -"background-color: #111633;\n" -"font: 12pt \"Microsoft YaHei UI\";\n" -"border: 1px;\n" -"padding:18px;\n" -"\n" -"}\n" -"*:pressed\n" -"{\n" -"color:#ffffff;\n" -"border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" -"background-color: #1A3E79;\n" -"}\n" -"") - - self.horizontalLayout_3.addWidget(self.pushButton_2) - - self.pushButton_3 = QPushButton(self.frame) - self.pushButton_3.setObjectName(u"pushButton_3") - sizePolicy1.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth()) - self.pushButton_3.setSizePolicy(sizePolicy1) - self.pushButton_3.setStyleSheet(u"\n" -"*{\n" -"color:#3479BE;\n" -"background-color: #111633;\n" -"font: 12pt \"Microsoft YaHei UI\";\n" -"border: 1px;\n" -"padding:18px;\n" -"\n" -"}\n" -"*:pressed\n" -"{\n" -"color:#ffffff;\n" -"border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" -"background-color: #1A3E79;\n" -"}\n" -"") - - self.horizontalLayout_3.addWidget(self.pushButton_3) - - self.pushButton_4 = QPushButton(self.frame) - self.pushButton_4.setObjectName(u"pushButton_4") - sizePolicy1.setHeightForWidth(self.pushButton_4.sizePolicy().hasHeightForWidth()) - self.pushButton_4.setSizePolicy(sizePolicy1) - self.pushButton_4.setStyleSheet(u"\n" -"*{\n" -"color:#3479BE;\n" -"background-color: #111633;\n" -"font: 12pt \"Microsoft YaHei UI\";\n" -"border: 1px;\n" -"padding:18px;\n" -"\n" -"}\n" -"*:pressed\n" -"{\n" -"color:#ffffff;\n" -"border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" -"background-color: #1A3E79;\n" -"}\n" -"") - - self.horizontalLayout_3.addWidget(self.pushButton_4) - - - self.horizontalLayout.addWidget(self.frame) - - self.frame_3 = QFrame(self.frame_head) - self.frame_3.setObjectName(u"frame_3") - sizePolicy1.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth()) - self.frame_3.setSizePolicy(sizePolicy1) - self.frame_3.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_3.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_5 = QHBoxLayout(self.frame_3) - self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") - self.pushButton_5 = QPushButton(self.frame_3) - self.pushButton_5.setObjectName(u"pushButton_5") - sizePolicy1.setHeightForWidth(self.pushButton_5.sizePolicy().hasHeightForWidth()) - self.pushButton_5.setSizePolicy(sizePolicy1) - self.pushButton_5.setStyleSheet(u"*{\n" -"color:#838992;\n" -"background-color: #1B1F34;\n" -"font: 9pt \"Microsoft YaHei UI\";\n" -"border: 1px solid #282B40;\n" -"}\n" -"*:pressed\n" -"{\n" -"color:#ffffff;\n" -"background-color: #1A3E79;\n" -"}\n" -"") - icon = QIcon() - icon.addFile(u":/main/Image/login.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.pushButton_5.setIcon(icon) - - self.horizontalLayout_5.addWidget(self.pushButton_5) - - self.pushButton_exit = QPushButton(self.frame_3) - self.pushButton_exit.setObjectName(u"pushButton_exit") - sizePolicy1.setHeightForWidth(self.pushButton_exit.sizePolicy().hasHeightForWidth()) - self.pushButton_exit.setSizePolicy(sizePolicy1) - self.pushButton_exit.setStyleSheet(u"*{\n" -"color:#838992;\n" -"background-color: #1B1F34;\n" -"font: 9pt \"Microsoft YaHei UI\";\n" -"border: 1px solid #282B40;\n" -"}\n" -"*:pressed\n" -"{\n" -"color:#ffffff;\n" -"background-color: #1A3E79;\n" -"}\n" -"") - icon1 = QIcon() - icon1.addFile(u":/main/Image/logout.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.pushButton_exit.setIcon(icon1) - - self.horizontalLayout_5.addWidget(self.pushButton_exit) - - - self.horizontalLayout.addWidget(self.frame_3) - - self.horizontalLayout.setStretch(0, 45) - self.horizontalLayout.setStretch(1, 137) - self.horizontalLayout.setStretch(2, 59) - - self.verticalLayout.addWidget(self.frame_head) - - self.frame_main = QFrame(self.centralwidget) - self.frame_main.setObjectName(u"frame_main") - self.frame_main.setStyleSheet(u"background-color: #0D1128;") - self.frame_main.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_main.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_4 = QHBoxLayout(self.frame_main) - self.horizontalLayout_4.setSpacing(0) - self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") - self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) - self.frame_left_menu = QFrame(self.frame_main) - self.frame_left_menu.setObjectName(u"frame_left_menu") - sizePolicy1.setHeightForWidth(self.frame_left_menu.sizePolicy().hasHeightForWidth()) - self.frame_left_menu.setSizePolicy(sizePolicy1) - self.frame_left_menu.setStyleSheet(u"background-color: #0D1128;\n" -"border: 1px solid #324C82;") - self.verticalLayout_2 = QVBoxLayout(self.frame_left_menu) - self.verticalLayout_2.setSpacing(8) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.verticalLayout_2.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint) - self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) - self.frame_2 = QFrame(self.frame_left_menu) - self.frame_2.setObjectName(u"frame_2") - sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) - self.frame_2.setSizePolicy(sizePolicy2) - self.frame_2.setStyleSheet(u"background-color: #0D1128;\n" -"border: none;") - self.frame_2.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_2.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_3 = QVBoxLayout(self.frame_2) - self.verticalLayout_3.setSpacing(0) - self.verticalLayout_3.setObjectName(u"verticalLayout_3") - self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) - self.pushButton_sysseting = QPushButton(self.frame_2) - self.pushButton_sysseting.setObjectName(u"pushButton_sysseting") - sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) - sizePolicy3.setHorizontalStretch(0) - sizePolicy3.setVerticalStretch(0) - sizePolicy3.setHeightForWidth(self.pushButton_sysseting.sizePolicy().hasHeightForWidth()) - self.pushButton_sysseting.setSizePolicy(sizePolicy3) - self.pushButton_sysseting.setStyleSheet(u" QPushButton {\n" -" \n" -" color: white; /* \u6309\u94ae\u6587\u672c\u989c\u8272 */\n" -" background-color: rgb(25, 30, 54);\n" -" padding: 10px ; /* \u6309\u94ae\u5185\u8fb9\u8ddd */\n" -" font: 12pt \"Microsoft YaHei UI\";\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn.jpg);\n" -" }") - icon2 = QIcon() - icon2.addFile(u":/main/Image/icon_leftMenu_btn_sys.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.pushButton_sysseting.setIcon(icon2) - self.pushButton_sysseting.setIconSize(QSize(20, 20)) - - self.verticalLayout_3.addWidget(self.pushButton_sysseting) - - self.frame_sys_seting = QFrame(self.frame_2) - self.frame_sys_seting.setObjectName(u"frame_sys_seting") - sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding) - sizePolicy4.setHorizontalStretch(0) - sizePolicy4.setVerticalStretch(0) - sizePolicy4.setHeightForWidth(self.frame_sys_seting.sizePolicy().hasHeightForWidth()) - self.frame_sys_seting.setSizePolicy(sizePolicy4) - self.frame_sys_seting.setStyleSheet(u"\n" -"background-color: rgb(13, 17, 40);") - self.frame_sys_seting.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_sys_seting.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_6 = QHBoxLayout(self.frame_sys_seting) - self.horizontalLayout_6.setSpacing(0) - self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") - self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) - self.frame_9 = QFrame(self.frame_sys_seting) - self.frame_9.setObjectName(u"frame_9") - self.frame_9.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_9.setFrameShadow(QFrame.Shadow.Raised) - - self.horizontalLayout_6.addWidget(self.frame_9) - - self.frame_10 = QFrame(self.frame_sys_seting) - self.frame_10.setObjectName(u"frame_10") - self.frame_10.setStyleSheet(u"background-color: rgb(13, 17, 40);") - self.frame_10.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_10.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_4 = QVBoxLayout(self.frame_10) - self.verticalLayout_4.setObjectName(u"verticalLayout_4") - self.pushButton_leftmenu_produce = QPushButton(self.frame_10) - self.pushButton_leftmenu_produce.setObjectName(u"pushButton_leftmenu_produce") - sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.pushButton_leftmenu_produce.sizePolicy().hasHeightForWidth()) - self.pushButton_leftmenu_produce.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_produce.setStyleSheet(u"\n" -"\n" -" QPushButton {\n" -" \n" -" background-color: rgb(16, 31, 63);\n" -" color: rgb(255, 255, 255);\n" -"\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"\n" -" }\n" -"*:pressed\n" -"{\n" -"border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"}\n" -"") - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_produce) - - self.pushButton_leftmenu_robot_seting = QPushButton(self.frame_10) - self.pushButton_leftmenu_robot_seting.setObjectName(u"pushButton_leftmenu_robot_seting") - sizePolicy5.setHeightForWidth(self.pushButton_leftmenu_robot_seting.sizePolicy().hasHeightForWidth()) - self.pushButton_leftmenu_robot_seting.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_robot_seting.setStyleSheet(u"\n" -"\n" -" QPushButton {\n" -" \n" -" background-color: rgb(16, 31, 63);\n" -" color: rgb(255, 255, 255);\n" -"\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"\n" -" }\n" -"*:pressed\n" -"{\n" -"border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"}\n" -"") - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_robot_seting) - - self.pushButton_leftmenu_IO = QPushButton(self.frame_10) - self.pushButton_leftmenu_IO.setObjectName(u"pushButton_leftmenu_IO") - sizePolicy5.setHeightForWidth(self.pushButton_leftmenu_IO.sizePolicy().hasHeightForWidth()) - self.pushButton_leftmenu_IO.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_IO.setStyleSheet(u"\n" -"\n" -" QPushButton {\n" -" \n" -" background-color: rgb(16, 31, 63);\n" -" color: rgb(255, 255, 255);\n" -"\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"\n" -" }\n" -"*:pressed\n" -"{\n" -"border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"}\n" -"") - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_IO) - - self.pushButton_leftmenu_position = QPushButton(self.frame_10) - self.pushButton_leftmenu_position.setObjectName(u"pushButton_leftmenu_position") - sizePolicy5.setHeightForWidth(self.pushButton_leftmenu_position.sizePolicy().hasHeightForWidth()) - self.pushButton_leftmenu_position.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_position.setStyleSheet(u"\n" -"\n" -" QPushButton {\n" -" \n" -" background-color: rgb(16, 31, 63);\n" -" color: rgb(255, 255, 255);\n" -"\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"\n" -" }\n" -"*:pressed\n" -"{\n" -"border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"}\n" -"") - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_position) - - self.pushButton_leftmenu_baseSeting = QPushButton(self.frame_10) - self.pushButton_leftmenu_baseSeting.setObjectName(u"pushButton_leftmenu_baseSeting") - sizePolicy5.setHeightForWidth(self.pushButton_leftmenu_baseSeting.sizePolicy().hasHeightForWidth()) - self.pushButton_leftmenu_baseSeting.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_baseSeting.setStyleSheet(u"\n" -"\n" -" QPushButton {\n" -" \n" -" background-color: rgb(16, 31, 63);\n" -" color: rgb(255, 255, 255);\n" -"\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"\n" -" }\n" -"*:pressed\n" -"{\n" -"border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"}\n" -"") - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_baseSeting) - - self.pushButton_leftmenu_posDebug = QPushButton(self.frame_10) - self.pushButton_leftmenu_posDebug.setObjectName(u"pushButton_leftmenu_posDebug") - sizePolicy5.setHeightForWidth(self.pushButton_leftmenu_posDebug.sizePolicy().hasHeightForWidth()) - self.pushButton_leftmenu_posDebug.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_posDebug.setStyleSheet(u"\n" -"\n" -" QPushButton {\n" -" \n" -" background-color: rgb(16, 31, 63);\n" -" color: rgb(255, 255, 255);\n" -"\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"\n" -" }\n" -"*:pressed\n" -"{\n" -"border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" -"}\n" -"") - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_posDebug) - - - self.horizontalLayout_6.addWidget(self.frame_10) - - self.horizontalLayout_6.setStretch(0, 1) - self.horizontalLayout_6.setStretch(1, 7) - - self.verticalLayout_3.addWidget(self.frame_sys_seting) - - self.verticalLayout_3.setStretch(0, 15) - - self.verticalLayout_2.addWidget(self.frame_2) - - self.frame_5 = QFrame(self.frame_left_menu) - self.frame_5.setObjectName(u"frame_5") - self.frame_5.setStyleSheet(u"border: none;") - self.frame_5.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_5.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_6 = QVBoxLayout(self.frame_5) - self.verticalLayout_6.setSpacing(0) - self.verticalLayout_6.setObjectName(u"verticalLayout_6") - self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) - self.pushButton_11 = QPushButton(self.frame_5) - self.pushButton_11.setObjectName(u"pushButton_11") - sizePolicy6 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) - sizePolicy6.setHorizontalStretch(0) - sizePolicy6.setVerticalStretch(0) - sizePolicy6.setHeightForWidth(self.pushButton_11.sizePolicy().hasHeightForWidth()) - self.pushButton_11.setSizePolicy(sizePolicy6) - self.pushButton_11.setStyleSheet(u" QPushButton {\n" -" \n" -" color: white; /* \u6309\u94ae\u6587\u672c\u989c\u8272 */\n" -" background-color: rgb(25, 30, 54);\n" -" padding: 10px ; /* \u6309\u94ae\u5185\u8fb9\u8ddd */\n" -" font: 12pt \"Microsoft YaHei UI\";\n" -" }\n" -" QPushButton:hover {\n" -" border-image: url(:/main/Image/backgroud_leftMenu_btn.jpg);\n" -" }") - icon3 = QIcon() - icon3.addFile(u":/main/Image/icon_other.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.pushButton_11.setIcon(icon3) - self.pushButton_11.setIconSize(QSize(20, 20)) - - self.verticalLayout_6.addWidget(self.pushButton_11) - - self.frame_other_set = QFrame(self.frame_5) - self.frame_other_set.setObjectName(u"frame_other_set") - self.frame_other_set.setStyleSheet(u"\n" -"background-color: rgb(13, 17, 40);") - self.frame_other_set.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_other_set.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_7 = QHBoxLayout(self.frame_other_set) - self.horizontalLayout_7.setSpacing(0) - self.horizontalLayout_7.setObjectName(u"horizontalLayout_7") - self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) - self.frame_12 = QFrame(self.frame_other_set) - self.frame_12.setObjectName(u"frame_12") - self.frame_12.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_12.setFrameShadow(QFrame.Shadow.Raised) - - self.horizontalLayout_7.addWidget(self.frame_12) - - self.frame_13 = QFrame(self.frame_other_set) - self.frame_13.setObjectName(u"frame_13") - self.frame_13.setStyleSheet(u"background-color: rgb(13, 17, 40);") - self.frame_13.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_13.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_5 = QVBoxLayout(self.frame_13) - self.verticalLayout_5.setSpacing(5) - self.verticalLayout_5.setObjectName(u"verticalLayout_5") - self.verticalLayout_5.setContentsMargins(5, 5, 5, 5) - - self.horizontalLayout_7.addWidget(self.frame_13) - - self.horizontalLayout_7.setStretch(0, 1) - self.horizontalLayout_7.setStretch(1, 7) - - self.verticalLayout_6.addWidget(self.frame_other_set) - - self.verticalLayout_6.setStretch(0, 15) - self.verticalLayout_6.setStretch(1, 30) - - self.verticalLayout_2.addWidget(self.frame_5) - - self.verticalLayout_2.setStretch(0, 1) - self.verticalLayout_2.setStretch(1, 1) - - self.horizontalLayout_4.addWidget(self.frame_left_menu) - - self.frame_view = QFrame(self.frame_main) - self.frame_view.setObjectName(u"frame_view") - sizePolicy1.setHeightForWidth(self.frame_view.sizePolicy().hasHeightForWidth()) - self.frame_view.setSizePolicy(sizePolicy1) - self.frame_view.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_view.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_8 = QVBoxLayout(self.frame_view) - self.verticalLayout_8.setSpacing(0) - self.verticalLayout_8.setObjectName(u"verticalLayout_8") - self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) - self.stackedWidget_view = QStackedWidget(self.frame_view) - self.stackedWidget_view.setObjectName(u"stackedWidget_view") - sizePolicy1.setHeightForWidth(self.stackedWidget_view.sizePolicy().hasHeightForWidth()) - self.stackedWidget_view.setSizePolicy(sizePolicy1) - self.page_3 = QWidget() - self.page_3.setObjectName(u"page_3") - self.verticalLayout_7 = QVBoxLayout(self.page_3) - self.verticalLayout_7.setSpacing(0) - self.verticalLayout_7.setObjectName(u"verticalLayout_7") - self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) - self.frame_14 = QFrame(self.page_3) - self.frame_14.setObjectName(u"frame_14") - self.frame_14.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_14.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_9 = QVBoxLayout(self.frame_14) - self.verticalLayout_9.setSpacing(0) - self.verticalLayout_9.setObjectName(u"verticalLayout_9") - self.verticalLayout_9.setContentsMargins(0, 0, 0, 0) - self.frame_showDetection = QFrame(self.frame_14) - self.frame_showDetection.setObjectName(u"frame_showDetection") - self.frame_showDetection.setStyleSheet(u"") - self.frame_showDetection.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_showDetection.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_14 = QVBoxLayout(self.frame_showDetection) - self.verticalLayout_14.setObjectName(u"verticalLayout_14") - self.frame_sign_2 = QFrame(self.frame_showDetection) - self.frame_sign_2.setObjectName(u"frame_sign_2") - sizePolicy1.setHeightForWidth(self.frame_sign_2.sizePolicy().hasHeightForWidth()) - self.frame_sign_2.setSizePolicy(sizePolicy1) - self.frame_sign_2.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"border-image: None;") - self.frame_sign_2.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_sign_2.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_4 = QGridLayout(self.frame_sign_2) - self.gridLayout_4.setObjectName(u"gridLayout_4") - self.pushButton_sign_go = QPushButton(self.frame_sign_2) - self.pushButton_sign_go.setObjectName(u"pushButton_sign_go") - sizePolicy1.setHeightForWidth(self.pushButton_sign_go.sizePolicy().hasHeightForWidth()) - self.pushButton_sign_go.setSizePolicy(sizePolicy1) - self.pushButton_sign_go.setStyleSheet(u"*{\n" -"background-color: #7A7A7A;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:disabled\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - - self.gridLayout_4.addWidget(self.pushButton_sign_go, 0, 0, 1, 1) - - self.label_sign_go = QLabel(self.frame_sign_2) - self.label_sign_go.setObjectName(u"label_sign_go") - sizePolicy1.setHeightForWidth(self.label_sign_go.sizePolicy().hasHeightForWidth()) - self.label_sign_go.setSizePolicy(sizePolicy1) - self.label_sign_go.setStyleSheet(u"\n" -"QLabel:disabled{\n" -" background-color: rgba(255, 255, 255, 0);\n" -" font: 700 12pt \"Microsoft YaHei UI\";\n" -" color: red;\n" -"}\n" -"\n" -"QLabel{\n" -"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color:#7A7A7A;\n" -"}") - self.label_sign_go.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_4.addWidget(self.label_sign_go, 0, 1, 1, 1) - - self.pushButton_sign_photo = QPushButton(self.frame_sign_2) - self.pushButton_sign_photo.setObjectName(u"pushButton_sign_photo") - sizePolicy1.setHeightForWidth(self.pushButton_sign_photo.sizePolicy().hasHeightForWidth()) - self.pushButton_sign_photo.setSizePolicy(sizePolicy1) - self.pushButton_sign_photo.setStyleSheet(u"*{\n" -"background-color: #7A7A7A;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:disabled\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - - self.gridLayout_4.addWidget(self.pushButton_sign_photo, 0, 2, 1, 1) - - self.label_sign_photo = QLabel(self.frame_sign_2) - self.label_sign_photo.setObjectName(u"label_sign_photo") - sizePolicy1.setHeightForWidth(self.label_sign_photo.sizePolicy().hasHeightForWidth()) - self.label_sign_photo.setSizePolicy(sizePolicy1) - self.label_sign_photo.setStyleSheet(u"\n" -"QLabel:disabled{\n" -" background-color: rgba(255, 255, 255, 0);\n" -" font: 700 12pt \"Microsoft YaHei UI\";\n" -" color: red;\n" -"}\n" -"\n" -"QLabel{\n" -"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color:#7A7A7A;\n" -"}") - self.label_sign_photo.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_4.addWidget(self.label_sign_photo, 0, 3, 1, 1) - - self.pushButton_sign_take = QPushButton(self.frame_sign_2) - self.pushButton_sign_take.setObjectName(u"pushButton_sign_take") - sizePolicy1.setHeightForWidth(self.pushButton_sign_take.sizePolicy().hasHeightForWidth()) - self.pushButton_sign_take.setSizePolicy(sizePolicy1) - self.pushButton_sign_take.setStyleSheet(u"*{\n" -"background-color: #7A7A7A;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:disabled\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - - self.gridLayout_4.addWidget(self.pushButton_sign_take, 0, 4, 1, 1) - - self.label_sign_take = QLabel(self.frame_sign_2) - self.label_sign_take.setObjectName(u"label_sign_take") - sizePolicy1.setHeightForWidth(self.label_sign_take.sizePolicy().hasHeightForWidth()) - self.label_sign_take.setSizePolicy(sizePolicy1) - self.label_sign_take.setStyleSheet(u"\n" -"QLabel:disabled{\n" -" background-color: rgba(255, 255, 255, 0);\n" -" font: 700 12pt \"Microsoft YaHei UI\";\n" -" color: red;\n" -"}\n" -"\n" -"QLabel{\n" -"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color:#7A7A7A;\n" -"}") - self.label_sign_take.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_4.addWidget(self.label_sign_take, 0, 5, 1, 1) - - self.pushButton_sign_feed = QPushButton(self.frame_sign_2) - self.pushButton_sign_feed.setObjectName(u"pushButton_sign_feed") - sizePolicy1.setHeightForWidth(self.pushButton_sign_feed.sizePolicy().hasHeightForWidth()) - self.pushButton_sign_feed.setSizePolicy(sizePolicy1) - self.pushButton_sign_feed.setStyleSheet(u"*{\n" -"background-color: #7A7A7A;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:disabled\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - - self.gridLayout_4.addWidget(self.pushButton_sign_feed, 0, 6, 1, 1) - - self.label_sign_feed = QLabel(self.frame_sign_2) - self.label_sign_feed.setObjectName(u"label_sign_feed") - sizePolicy1.setHeightForWidth(self.label_sign_feed.sizePolicy().hasHeightForWidth()) - self.label_sign_feed.setSizePolicy(sizePolicy1) - self.label_sign_feed.setStyleSheet(u"\n" -"QLabel:disabled{\n" -" background-color: rgba(255, 255, 255, 0);\n" -" font: 700 12pt \"Microsoft YaHei UI\";\n" -" color: red;\n" -"}\n" -"\n" -"QLabel{\n" -"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color:#7A7A7A;\n" -"}") - self.label_sign_feed.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_4.addWidget(self.label_sign_feed, 0, 7, 1, 1) - - - self.verticalLayout_14.addWidget(self.frame_sign_2) - - self.label_showDetection = QLabel(self.frame_showDetection) - self.label_showDetection.setObjectName(u"label_showDetection") - sizePolicy1.setHeightForWidth(self.label_showDetection.sizePolicy().hasHeightForWidth()) - self.label_showDetection.setSizePolicy(sizePolicy1) - self.label_showDetection.setSizeIncrement(QSize(0, 0)) - self.label_showDetection.setBaseSize(QSize(0, 0)) - self.label_showDetection.setAutoFillBackground(False) - self.label_showDetection.setStyleSheet(u"background-image: url(:/main/Image/wait.png);\n" -"background-position: center;\n" -"background-repeat: no-repeat;\n" -" ") - self.label_showDetection.setScaledContents(False) - - self.verticalLayout_14.addWidget(self.label_showDetection) - - self.label_move_sign = QLabel(self.frame_showDetection) - self.label_move_sign.setObjectName(u"label_move_sign") - sizePolicy1.setHeightForWidth(self.label_move_sign.sizePolicy().hasHeightForWidth()) - self.label_move_sign.setSizePolicy(sizePolicy1) - self.label_move_sign.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"color: red;\n" -"border-image: None;") - self.label_move_sign.setAlignment(Qt.AlignmentFlag.AlignBottom|Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing) - - self.verticalLayout_14.addWidget(self.label_move_sign) - - self.verticalLayout_14.setStretch(0, 1) - self.verticalLayout_14.setStretch(1, 20) - self.verticalLayout_14.setStretch(2, 1) - - self.verticalLayout_9.addWidget(self.frame_showDetection) - - self.frame_15 = QFrame(self.frame_14) - self.frame_15.setObjectName(u"frame_15") - self.frame_15.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_15.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_8 = QHBoxLayout(self.frame_15) - self.horizontalLayout_8.setSpacing(0) - self.horizontalLayout_8.setObjectName(u"horizontalLayout_8") - self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0) - self.frame_17 = QFrame(self.frame_15) - self.frame_17.setObjectName(u"frame_17") - sizePolicy.setHeightForWidth(self.frame_17.sizePolicy().hasHeightForWidth()) - self.frame_17.setSizePolicy(sizePolicy) - self.frame_17.setStyleSheet(u"border: 1px solid #324C82;") - self.frame_17.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_17.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_9 = QHBoxLayout(self.frame_17) - self.horizontalLayout_9.setSpacing(0) - self.horizontalLayout_9.setObjectName(u"horizontalLayout_9") - self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0) - self.tabWidget = QTabWidget(self.frame_17) - self.tabWidget.setObjectName(u"tabWidget") - sizePolicy1.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) - self.tabWidget.setSizePolicy(sizePolicy1) - self.tabWidget.setStyleSheet(u"\n" -"\n" -"QTabBar::tab {\n" -" background: #191E36;\n" -" padding: 10px;\n" -"border:None;\n" -" color:#ffffff\n" -"}\n" -"") - self.tabWidget.setTabShape(QTabWidget.TabShape.Rounded) - self.tabWidget.setElideMode(Qt.TextElideMode.ElideNone) - self.tabWidget.setDocumentMode(True) - self.tabWidget.setTabsClosable(False) - self.tabWidget.setTabBarAutoHide(False) - self.tab = QWidget() - self.tab.setObjectName(u"tab") - self.horizontalLayout_13 = QHBoxLayout(self.tab) - self.horizontalLayout_13.setSpacing(0) - self.horizontalLayout_13.setObjectName(u"horizontalLayout_13") - self.horizontalLayout_13.setContentsMargins(0, 0, 0, 0) - self.textEdit_log_info = QTextEdit(self.tab) - self.textEdit_log_info.setObjectName(u"textEdit_log_info") - self.textEdit_log_info.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.horizontalLayout_13.addWidget(self.textEdit_log_info) - - icon4 = QIcon() - icon4.addFile(u":/main/Image/log.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.tabWidget.addTab(self.tab, icon4, "") - self.tab_2 = QWidget() - self.tab_2.setObjectName(u"tab_2") - self.horizontalLayout_14 = QHBoxLayout(self.tab_2) - self.horizontalLayout_14.setSpacing(0) - self.horizontalLayout_14.setObjectName(u"horizontalLayout_14") - self.horizontalLayout_14.setContentsMargins(0, 0, 0, 0) - self.textEdit_log_error = QTextEdit(self.tab_2) - self.textEdit_log_error.setObjectName(u"textEdit_log_error") - self.textEdit_log_error.setStyleSheet(u"\n" -"color: rgb(255, 0, 0);") - - self.horizontalLayout_14.addWidget(self.textEdit_log_error) - - icon5 = QIcon() - icon5.addFile(u":/main/Image/waring.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.tabWidget.addTab(self.tab_2, icon5, "") - - self.horizontalLayout_9.addWidget(self.tabWidget) - - - self.horizontalLayout_8.addWidget(self.frame_17) - - self.frame_18 = QFrame(self.frame_15) - self.frame_18.setObjectName(u"frame_18") - self.frame_18.setStyleSheet(u"border: 1px solid #324C82;") - self.frame_18.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_18.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_13 = QVBoxLayout(self.frame_18) - self.verticalLayout_13.setObjectName(u"verticalLayout_13") - self.frame_25 = QFrame(self.frame_18) - self.frame_25.setObjectName(u"frame_25") - self.frame_25.setStyleSheet(u"border:None") - self.frame_25.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_25.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_3 = QGridLayout(self.frame_25) - self.gridLayout_3.setSpacing(0) - self.gridLayout_3.setObjectName(u"gridLayout_3") - self.gridLayout_3.setContentsMargins(0, 0, 0, 0) - self.label_53 = QLabel(self.frame_25) - self.label_53.setObjectName(u"label_53") - self.label_53.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_53.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_3.addWidget(self.label_53, 0, 0, 1, 1) - - self.label_connect_status = QLabel(self.frame_25) - self.label_connect_status.setObjectName(u"label_connect_status") - sizePolicy2.setHeightForWidth(self.label_connect_status.sizePolicy().hasHeightForWidth()) - self.label_connect_status.setSizePolicy(sizePolicy2) - self.label_connect_status.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"QLabel:disabled{\n" -" background-color: #FD3251; \n" -" color: #ffffff; \n" -" border-radius: 8px; \n" -" border: 1px solid #FD3251; \n" -" qproperty-alignment: 'AlignCenter'; \n" -"}\n" -"") - - self.gridLayout_3.addWidget(self.label_connect_status, 0, 1, 1, 1) - - self.label_8 = QLabel(self.frame_25) - self.label_8.setObjectName(u"label_8") - self.label_8.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_8.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_3.addWidget(self.label_8, 1, 0, 1, 1) - - self.label_status_model = QLabel(self.frame_25) - self.label_status_model.setObjectName(u"label_status_model") - sizePolicy2.setHeightForWidth(self.label_status_model.sizePolicy().hasHeightForWidth()) - self.label_status_model.setSizePolicy(sizePolicy2) - self.label_status_model.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - - self.gridLayout_3.addWidget(self.label_status_model, 1, 1, 1, 1) - - self.label_10 = QLabel(self.frame_25) - self.label_10.setObjectName(u"label_10") - self.label_10.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_10.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_3.addWidget(self.label_10, 2, 0, 1, 1) - - self.label_status_remoteCmdLen = QLabel(self.frame_25) - self.label_status_remoteCmdLen.setObjectName(u"label_status_remoteCmdLen") - sizePolicy2.setHeightForWidth(self.label_status_remoteCmdLen.sizePolicy().hasHeightForWidth()) - self.label_status_remoteCmdLen.setSizePolicy(sizePolicy2) - self.label_status_remoteCmdLen.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - - self.gridLayout_3.addWidget(self.label_status_remoteCmdLen, 2, 1, 1, 1) - - self.label_13 = QLabel(self.frame_25) - self.label_13.setObjectName(u"label_13") - self.label_13.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_13.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_3.addWidget(self.label_13, 3, 0, 1, 1) - - self.label_status_speed = QLabel(self.frame_25) - self.label_status_speed.setObjectName(u"label_status_speed") - sizePolicy2.setHeightForWidth(self.label_status_speed.sizePolicy().hasHeightForWidth()) - self.label_status_speed.setSizePolicy(sizePolicy2) - self.label_status_speed.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - - self.gridLayout_3.addWidget(self.label_status_speed, 3, 1, 1, 1) - - self.label_11 = QLabel(self.frame_25) - self.label_11.setObjectName(u"label_11") - self.label_11.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_11.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_3.addWidget(self.label_11, 4, 0, 1, 1) - - self.label_status_toolIndex = QLabel(self.frame_25) - self.label_status_toolIndex.setObjectName(u"label_status_toolIndex") - sizePolicy2.setHeightForWidth(self.label_status_toolIndex.sizePolicy().hasHeightForWidth()) - self.label_status_toolIndex.setSizePolicy(sizePolicy2) - self.label_status_toolIndex.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - - self.gridLayout_3.addWidget(self.label_status_toolIndex, 4, 1, 1, 1) - - self.label_12 = QLabel(self.frame_25) - self.label_12.setObjectName(u"label_12") - self.label_12.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_12.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_3.addWidget(self.label_12, 5, 0, 1, 1) - - self.label_status_alarmcode = QLabel(self.frame_25) - self.label_status_alarmcode.setObjectName(u"label_status_alarmcode") - sizePolicy2.setHeightForWidth(self.label_status_alarmcode.sizePolicy().hasHeightForWidth()) - self.label_status_alarmcode.setSizePolicy(sizePolicy2) - self.label_status_alarmcode.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - - self.gridLayout_3.addWidget(self.label_status_alarmcode, 5, 1, 1, 1) - - - self.verticalLayout_13.addWidget(self.frame_25) - - - self.horizontalLayout_8.addWidget(self.frame_18) - - self.horizontalLayout_8.setStretch(0, 3) - self.horizontalLayout_8.setStretch(1, 2) - - self.verticalLayout_9.addWidget(self.frame_15) - - self.verticalLayout_9.setStretch(0, 3) - self.verticalLayout_9.setStretch(1, 2) - - self.verticalLayout_7.addWidget(self.frame_14) - - self.verticalLayout_7.setStretch(0, 1) - self.stackedWidget_view.addWidget(self.page_3) - self.page_7 = QWidget() - self.page_7.setObjectName(u"page_7") - self.horizontalLayout_19 = QHBoxLayout(self.page_7) - self.horizontalLayout_19.setSpacing(0) - self.horizontalLayout_19.setObjectName(u"horizontalLayout_19") - self.horizontalLayout_19.setContentsMargins(0, 0, 0, 0) - self.frame_11 = QFrame(self.page_7) - self.frame_11.setObjectName(u"frame_11") - self.frame_11.setStyleSheet(u"font: 700 16pt \"Microsoft YaHei UI\";") - self.frame_11.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_11.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_8 = QGridLayout(self.frame_11) - self.gridLayout_8.setObjectName(u"gridLayout_8") - self.gridLayout_8.setVerticalSpacing(40) - self.label_5 = QLabel(self.frame_11) - self.label_5.setObjectName(u"label_5") - self.label_5.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_5.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_5, 0, 0, 1, 1) - - self.widget_y1 = ToggleSwitch(self.frame_11) - self.widget_y1.setObjectName(u"widget_y1") - self.widget_y1.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y1, 0, 1, 1, 1) - - self.label_57 = QLabel(self.frame_11) - self.label_57.setObjectName(u"label_57") - self.label_57.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_57.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_57, 0, 2, 1, 1) - - self.widget_y2 = ToggleSwitch(self.frame_11) - self.widget_y2.setObjectName(u"widget_y2") - self.widget_y2.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y2, 0, 3, 1, 1) - - self.label_58 = QLabel(self.frame_11) - self.label_58.setObjectName(u"label_58") - self.label_58.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_58.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_58, 0, 4, 1, 1) - - self.widget_y3 = ToggleSwitch(self.frame_11) - self.widget_y3.setObjectName(u"widget_y3") - self.widget_y3.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y3, 0, 5, 1, 1) - - self.label_59 = QLabel(self.frame_11) - self.label_59.setObjectName(u"label_59") - self.label_59.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_59.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_59, 0, 6, 1, 1) - - self.widget_y4 = ToggleSwitch(self.frame_11) - self.widget_y4.setObjectName(u"widget_y4") - self.widget_y4.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y4, 0, 7, 1, 1) - - self.label_7 = QLabel(self.frame_11) - self.label_7.setObjectName(u"label_7") - self.label_7.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_7.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_7, 1, 0, 1, 1) - - self.widget_y5 = ToggleSwitch(self.frame_11) - self.widget_y5.setObjectName(u"widget_y5") - self.widget_y5.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y5, 1, 1, 1, 1) - - self.label_61 = QLabel(self.frame_11) - self.label_61.setObjectName(u"label_61") - self.label_61.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_61.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_61, 1, 2, 1, 1) - - self.widget_y6 = ToggleSwitch(self.frame_11) - self.widget_y6.setObjectName(u"widget_y6") - self.widget_y6.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y6, 1, 3, 1, 1) - - self.label_62 = QLabel(self.frame_11) - self.label_62.setObjectName(u"label_62") - self.label_62.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_62.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_62, 1, 4, 1, 1) - - self.widget_y7 = ToggleSwitch(self.frame_11) - self.widget_y7.setObjectName(u"widget_y7") - self.widget_y7.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y7, 1, 5, 1, 1) - - self.label_60 = QLabel(self.frame_11) - self.label_60.setObjectName(u"label_60") - self.label_60.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_60.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_60, 1, 6, 1, 1) - - self.widget_y8 = ToggleSwitch(self.frame_11) - self.widget_y8.setObjectName(u"widget_y8") - self.widget_y8.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y8, 1, 7, 1, 1) - - self.label_55 = QLabel(self.frame_11) - self.label_55.setObjectName(u"label_55") - self.label_55.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_55.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_55, 2, 0, 1, 1) - - self.widget_y9 = ToggleSwitch(self.frame_11) - self.widget_y9.setObjectName(u"widget_y9") - self.widget_y9.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y9, 2, 1, 1, 1) - - self.label_65 = QLabel(self.frame_11) - self.label_65.setObjectName(u"label_65") - self.label_65.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_65.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_65, 2, 2, 1, 1) - - self.widget_y10 = ToggleSwitch(self.frame_11) - self.widget_y10.setObjectName(u"widget_y10") - self.widget_y10.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y10, 2, 3, 1, 1) - - self.label_64 = QLabel(self.frame_11) - self.label_64.setObjectName(u"label_64") - self.label_64.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_64.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_64, 2, 4, 1, 1) - - self.widget_y11 = ToggleSwitch(self.frame_11) - self.widget_y11.setObjectName(u"widget_y11") - self.widget_y11.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y11, 2, 5, 1, 1) - - self.label_63 = QLabel(self.frame_11) - self.label_63.setObjectName(u"label_63") - self.label_63.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_63.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_63, 2, 6, 1, 1) - - self.widget_y12 = ToggleSwitch(self.frame_11) - self.widget_y12.setObjectName(u"widget_y12") - self.widget_y12.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y12, 2, 7, 1, 1) - - self.label_56 = QLabel(self.frame_11) - self.label_56.setObjectName(u"label_56") - self.label_56.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_56.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_56, 3, 0, 1, 1) - - self.widget_y13 = ToggleSwitch(self.frame_11) - self.widget_y13.setObjectName(u"widget_y13") - self.widget_y13.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y13, 3, 1, 1, 1) - - self.label_68 = QLabel(self.frame_11) - self.label_68.setObjectName(u"label_68") - self.label_68.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_68.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_68, 3, 2, 1, 1) - - self.widget_y14 = ToggleSwitch(self.frame_11) - self.widget_y14.setObjectName(u"widget_y14") - self.widget_y14.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y14, 3, 3, 1, 1) - - self.label_67 = QLabel(self.frame_11) - self.label_67.setObjectName(u"label_67") - self.label_67.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_67.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_67, 3, 4, 1, 1) - - self.widget_y15 = ToggleSwitch(self.frame_11) - self.widget_y15.setObjectName(u"widget_y15") - self.widget_y15.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y15, 3, 5, 1, 1) - - self.label_66 = QLabel(self.frame_11) - self.label_66.setObjectName(u"label_66") - self.label_66.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_66.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_66, 3, 6, 1, 1) - - self.widget_y16 = ToggleSwitch(self.frame_11) - self.widget_y16.setObjectName(u"widget_y16") - self.widget_y16.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y16, 3, 7, 1, 1) - - self.label_69 = QLabel(self.frame_11) - self.label_69.setObjectName(u"label_69") - self.label_69.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_69.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_69, 4, 0, 1, 1) - - self.widget_y17 = ToggleSwitch(self.frame_11) - self.widget_y17.setObjectName(u"widget_y17") - self.widget_y17.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y17, 4, 1, 1, 1) - - self.label_81 = QLabel(self.frame_11) - self.label_81.setObjectName(u"label_81") - self.label_81.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_81.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_81, 4, 2, 1, 1) - - self.widget_y18 = ToggleSwitch(self.frame_11) - self.widget_y18.setObjectName(u"widget_y18") - self.widget_y18.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y18, 4, 3, 1, 1) - - self.label_82 = QLabel(self.frame_11) - self.label_82.setObjectName(u"label_82") - self.label_82.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_82.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_82, 4, 4, 1, 1) - - self.widget_y19 = ToggleSwitch(self.frame_11) - self.widget_y19.setObjectName(u"widget_y19") - self.widget_y19.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y19, 4, 5, 1, 1) - - self.label_78 = QLabel(self.frame_11) - self.label_78.setObjectName(u"label_78") - self.label_78.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_78.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_78, 4, 6, 1, 1) - - self.widget_y20 = ToggleSwitch(self.frame_11) - self.widget_y20.setObjectName(u"widget_y20") - self.widget_y20.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y20, 4, 7, 1, 1) - - self.label_72 = QLabel(self.frame_11) - self.label_72.setObjectName(u"label_72") - self.label_72.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_72.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_72, 5, 0, 1, 1) - - self.widget_y21 = ToggleSwitch(self.frame_11) - self.widget_y21.setObjectName(u"widget_y21") - self.widget_y21.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y21, 5, 1, 1, 1) - - self.label_84 = QLabel(self.frame_11) - self.label_84.setObjectName(u"label_84") - self.label_84.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_84.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_84, 5, 2, 1, 1) - - self.widget_y22 = ToggleSwitch(self.frame_11) - self.widget_y22.setObjectName(u"widget_y22") - self.widget_y22.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y22, 5, 3, 1, 1) - - self.label_77 = QLabel(self.frame_11) - self.label_77.setObjectName(u"label_77") - self.label_77.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_77.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_77, 5, 4, 1, 1) - - self.widget_y23 = ToggleSwitch(self.frame_11) - self.widget_y23.setObjectName(u"widget_y23") - self.widget_y23.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y23, 5, 5, 1, 1) - - self.label_71 = QLabel(self.frame_11) - self.label_71.setObjectName(u"label_71") - self.label_71.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_71.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_71, 5, 6, 1, 1) - - self.widget_y24 = ToggleSwitch(self.frame_11) - self.widget_y24.setObjectName(u"widget_y24") - self.widget_y24.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y24, 5, 7, 1, 1) - - self.label_70 = QLabel(self.frame_11) - self.label_70.setObjectName(u"label_70") - self.label_70.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_70.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_70, 6, 0, 1, 1) - - self.widget_y25 = ToggleSwitch(self.frame_11) - self.widget_y25.setObjectName(u"widget_y25") - self.widget_y25.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y25, 6, 1, 1, 1) - - self.label_80 = QLabel(self.frame_11) - self.label_80.setObjectName(u"label_80") - self.label_80.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_80.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_80, 6, 2, 1, 1) - - self.widget_y26 = ToggleSwitch(self.frame_11) - self.widget_y26.setObjectName(u"widget_y26") - self.widget_y26.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y26, 6, 3, 1, 1) - - self.label_74 = QLabel(self.frame_11) - self.label_74.setObjectName(u"label_74") - self.label_74.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_74.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_74, 6, 4, 1, 1) - - self.widget_y27 = ToggleSwitch(self.frame_11) - self.widget_y27.setObjectName(u"widget_y27") - self.widget_y27.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y27, 6, 5, 1, 1) - - self.label_73 = QLabel(self.frame_11) - self.label_73.setObjectName(u"label_73") - self.label_73.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_73.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_73, 6, 6, 1, 1) - - self.widget_y28 = ToggleSwitch(self.frame_11) - self.widget_y28.setObjectName(u"widget_y28") - self.widget_y28.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y28, 6, 7, 1, 1) - - self.label_75 = QLabel(self.frame_11) - self.label_75.setObjectName(u"label_75") - self.label_75.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_75.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_75, 7, 0, 1, 1) - - self.widget_y29 = ToggleSwitch(self.frame_11) - self.widget_y29.setObjectName(u"widget_y29") - self.widget_y29.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y29, 7, 1, 1, 1) - - self.label_76 = QLabel(self.frame_11) - self.label_76.setObjectName(u"label_76") - self.label_76.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_76.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_76, 7, 2, 1, 1) - - self.widget_y30 = ToggleSwitch(self.frame_11) - self.widget_y30.setObjectName(u"widget_y30") - self.widget_y30.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y30, 7, 3, 1, 1) - - self.label_83 = QLabel(self.frame_11) - self.label_83.setObjectName(u"label_83") - self.label_83.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_83.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_83, 7, 4, 1, 1) - - self.widget_y31 = ToggleSwitch(self.frame_11) - self.widget_y31.setObjectName(u"widget_y31") - self.widget_y31.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y31, 7, 5, 1, 1) - - self.label_79 = QLabel(self.frame_11) - self.label_79.setObjectName(u"label_79") - self.label_79.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_79.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_79, 7, 6, 1, 1) - - self.widget_y32 = ToggleSwitch(self.frame_11) - self.widget_y32.setObjectName(u"widget_y32") - self.widget_y32.setStyleSheet(u"background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y32, 7, 7, 1, 1) - - - self.horizontalLayout_19.addWidget(self.frame_11) - - self.stackedWidget_view.addWidget(self.page_7) - self.page_4 = QWidget() - self.page_4.setObjectName(u"page_4") - self.verticalLayout_15 = QVBoxLayout(self.page_4) - self.verticalLayout_15.setSpacing(0) - self.verticalLayout_15.setObjectName(u"verticalLayout_15") - self.verticalLayout_15.setContentsMargins(0, 0, 0, 0) - self.frame_6 = QFrame(self.page_4) - self.frame_6.setObjectName(u"frame_6") - self.frame_6.setStyleSheet(u"border:1px solid #324C82;") - self.frame_6.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_6.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_16 = QVBoxLayout(self.frame_6) - self.verticalLayout_16.setObjectName(u"verticalLayout_16") - self.frame_27 = QFrame(self.frame_6) - self.frame_27.setObjectName(u"frame_27") - self.frame_27.setStyleSheet(u"color:#ffffff;\n" -"border:None;") - self.frame_27.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_27.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_9 = QGridLayout(self.frame_27) - self.gridLayout_9.setObjectName(u"gridLayout_9") - self.gridLayout_9.setVerticalSpacing(80) - self.label_92 = QLabel(self.frame_27) - self.label_92.setObjectName(u"label_92") - sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) - sizePolicy7.setHorizontalStretch(0) - sizePolicy7.setVerticalStretch(0) - sizePolicy7.setHeightForWidth(self.label_92.sizePolicy().hasHeightForWidth()) - self.label_92.setSizePolicy(sizePolicy7) - self.label_92.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_92, 1, 2, 1, 1) - - self.lineEdit_origin_y = QLineEdit(self.frame_27) - self.lineEdit_origin_y.setObjectName(u"lineEdit_origin_y") - sizePolicy4.setHeightForWidth(self.lineEdit_origin_y.sizePolicy().hasHeightForWidth()) - self.lineEdit_origin_y.setSizePolicy(sizePolicy4) - self.lineEdit_origin_y.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_origin_y.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_y, 0, 3, 1, 1) - - self.lineEdit_origin_v = QLineEdit(self.frame_27) - self.lineEdit_origin_v.setObjectName(u"lineEdit_origin_v") - sizePolicy4.setHeightForWidth(self.lineEdit_origin_v.sizePolicy().hasHeightForWidth()) - self.lineEdit_origin_v.setSizePolicy(sizePolicy4) - self.lineEdit_origin_v.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_origin_v.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_v, 1, 3, 1, 1) - - self.label_88 = QLabel(self.frame_27) - self.label_88.setObjectName(u"label_88") - sizePolicy7.setHeightForWidth(self.label_88.sizePolicy().hasHeightForWidth()) - self.label_88.setSizePolicy(sizePolicy7) - self.label_88.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_88, 0, 4, 1, 1) - - self.label_93 = QLabel(self.frame_27) - self.label_93.setObjectName(u"label_93") - sizePolicy7.setHeightForWidth(self.label_93.sizePolicy().hasHeightForWidth()) - self.label_93.setSizePolicy(sizePolicy7) - self.label_93.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_93, 0, 2, 1, 1) - - self.label_95 = QLabel(self.frame_27) - self.label_95.setObjectName(u"label_95") - sizePolicy7.setHeightForWidth(self.label_95.sizePolicy().hasHeightForWidth()) - self.label_95.setSizePolicy(sizePolicy7) - self.label_95.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_95, 1, 0, 1, 1) - - self.label_90 = QLabel(self.frame_27) - self.label_90.setObjectName(u"label_90") - sizePolicy7.setHeightForWidth(self.label_90.sizePolicy().hasHeightForWidth()) - self.label_90.setSizePolicy(sizePolicy7) - self.label_90.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_90, 0, 0, 1, 1) - - self.lineEdit_origin_u = QLineEdit(self.frame_27) - self.lineEdit_origin_u.setObjectName(u"lineEdit_origin_u") - sizePolicy4.setHeightForWidth(self.lineEdit_origin_u.sizePolicy().hasHeightForWidth()) - self.lineEdit_origin_u.setSizePolicy(sizePolicy4) - self.lineEdit_origin_u.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_origin_u.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_u, 1, 1, 1, 1) - - self.lineEdit_origin_x = QLineEdit(self.frame_27) - self.lineEdit_origin_x.setObjectName(u"lineEdit_origin_x") - sizePolicy4.setHeightForWidth(self.lineEdit_origin_x.sizePolicy().hasHeightForWidth()) - self.lineEdit_origin_x.setSizePolicy(sizePolicy4) - self.lineEdit_origin_x.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_origin_x.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_x, 0, 1, 1, 1) - - self.label_91 = QLabel(self.frame_27) - self.label_91.setObjectName(u"label_91") - sizePolicy7.setHeightForWidth(self.label_91.sizePolicy().hasHeightForWidth()) - self.label_91.setSizePolicy(sizePolicy7) - self.label_91.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_91, 1, 4, 1, 1) - - self.lineEdit_origin_w = QLineEdit(self.frame_27) - self.lineEdit_origin_w.setObjectName(u"lineEdit_origin_w") - sizePolicy4.setHeightForWidth(self.lineEdit_origin_w.sizePolicy().hasHeightForWidth()) - self.lineEdit_origin_w.setSizePolicy(sizePolicy4) - self.lineEdit_origin_w.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_origin_w.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_w, 1, 5, 1, 1) - - self.lineEdit_origin_z = QLineEdit(self.frame_27) - self.lineEdit_origin_z.setObjectName(u"lineEdit_origin_z") - sizePolicy4.setHeightForWidth(self.lineEdit_origin_z.sizePolicy().hasHeightForWidth()) - self.lineEdit_origin_z.setSizePolicy(sizePolicy4) - self.lineEdit_origin_z.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_origin_z.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_z, 0, 5, 1, 1) - - self.pushButton_get_origin = QPushButton(self.frame_27) - self.pushButton_get_origin.setObjectName(u"pushButton_get_origin") - sizePolicy4.setHeightForWidth(self.pushButton_get_origin.sizePolicy().hasHeightForWidth()) - self.pushButton_get_origin.setSizePolicy(sizePolicy4) - self.pushButton_get_origin.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_9.addWidget(self.pushButton_get_origin, 2, 1, 1, 2) - - self.pushButton_set_origin = QPushButton(self.frame_27) - self.pushButton_set_origin.setObjectName(u"pushButton_set_origin") - sizePolicy4.setHeightForWidth(self.pushButton_set_origin.sizePolicy().hasHeightForWidth()) - self.pushButton_set_origin.setSizePolicy(sizePolicy4) - self.pushButton_set_origin.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_9.addWidget(self.pushButton_set_origin, 2, 4, 1, 2) - - self.gridLayout_9.setRowStretch(0, 1) - self.gridLayout_9.setRowStretch(1, 1) - self.gridLayout_9.setRowStretch(2, 1) - - self.verticalLayout_16.addWidget(self.frame_27) - - - self.verticalLayout_15.addWidget(self.frame_6) - - self.frame_26 = QFrame(self.page_4) - self.frame_26.setObjectName(u"frame_26") - self.frame_26.setStyleSheet(u"border:1px solid #324C82;") - self.frame_26.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_26.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_16 = QHBoxLayout(self.frame_26) - self.horizontalLayout_16.setObjectName(u"horizontalLayout_16") - self.horizontalLayout_16.setContentsMargins(-1, 12, -1, -1) - self.frame_28 = QFrame(self.frame_26) - self.frame_28.setObjectName(u"frame_28") - self.frame_28.setStyleSheet(u"color:#ffffff;\n" -"border:None;") - self.frame_28.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_28.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_5 = QGridLayout(self.frame_28) - self.gridLayout_5.setObjectName(u"gridLayout_5") - self.gridLayout_5.setVerticalSpacing(35) - self.lineEdit_v5 = QLineEdit(self.frame_28) - self.lineEdit_v5.setObjectName(u"lineEdit_v5") - sizePolicy1.setHeightForWidth(self.lineEdit_v5.sizePolicy().hasHeightForWidth()) - self.lineEdit_v5.setSizePolicy(sizePolicy1) - self.lineEdit_v5.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_v5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v5, 4, 9, 1, 1) - - self.lineEdit_w5 = QLineEdit(self.frame_28) - self.lineEdit_w5.setObjectName(u"lineEdit_w5") - sizePolicy1.setHeightForWidth(self.lineEdit_w5.sizePolicy().hasHeightForWidth()) - self.lineEdit_w5.setSizePolicy(sizePolicy1) - self.lineEdit_w5.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_w5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w5, 4, 11, 1, 1) - - self.lineEdit_v1 = QLineEdit(self.frame_28) - self.lineEdit_v1.setObjectName(u"lineEdit_v1") - sizePolicy1.setHeightForWidth(self.lineEdit_v1.sizePolicy().hasHeightForWidth()) - self.lineEdit_v1.setSizePolicy(sizePolicy1) - self.lineEdit_v1.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_v1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v1, 0, 9, 1, 1) - - self.pushButton_get_p2 = QPushButton(self.frame_28) - self.pushButton_get_p2.setObjectName(u"pushButton_get_p2") - sizePolicy5.setHeightForWidth(self.pushButton_get_p2.sizePolicy().hasHeightForWidth()) - self.pushButton_get_p2.setSizePolicy(sizePolicy5) - self.pushButton_get_p2.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_get_p2, 1, 12, 1, 1) - - self.lineEdit_y2 = QLineEdit(self.frame_28) - self.lineEdit_y2.setObjectName(u"lineEdit_y2") - sizePolicy1.setHeightForWidth(self.lineEdit_y2.sizePolicy().hasHeightForWidth()) - self.lineEdit_y2.setSizePolicy(sizePolicy1) - self.lineEdit_y2.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_y2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y2, 1, 3, 1, 1) - - self.lineEdit_x1 = QLineEdit(self.frame_28) - self.lineEdit_x1.setObjectName(u"lineEdit_x1") - sizePolicy1.setHeightForWidth(self.lineEdit_x1.sizePolicy().hasHeightForWidth()) - self.lineEdit_x1.setSizePolicy(sizePolicy1) - self.lineEdit_x1.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_x1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x1, 0, 1, 1, 1) - - self.lineEdit_x2 = QLineEdit(self.frame_28) - self.lineEdit_x2.setObjectName(u"lineEdit_x2") - sizePolicy1.setHeightForWidth(self.lineEdit_x2.sizePolicy().hasHeightForWidth()) - self.lineEdit_x2.setSizePolicy(sizePolicy1) - self.lineEdit_x2.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_x2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x2, 1, 1, 1, 1) - - self.pushButton_set_p1 = QPushButton(self.frame_28) - self.pushButton_set_p1.setObjectName(u"pushButton_set_p1") - sizePolicy5.setHeightForWidth(self.pushButton_set_p1.sizePolicy().hasHeightForWidth()) - self.pushButton_set_p1.setSizePolicy(sizePolicy5) - self.pushButton_set_p1.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_set_p1, 0, 13, 1, 1) - - self.label_16 = QLabel(self.frame_28) - self.label_16.setObjectName(u"label_16") - sizePolicy4.setHeightForWidth(self.label_16.sizePolicy().hasHeightForWidth()) - self.label_16.setSizePolicy(sizePolicy4) - self.label_16.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_16, 1, 0, 1, 1) - - self.lineEdit_z5 = QLineEdit(self.frame_28) - self.lineEdit_z5.setObjectName(u"lineEdit_z5") - sizePolicy1.setHeightForWidth(self.lineEdit_z5.sizePolicy().hasHeightForWidth()) - self.lineEdit_z5.setSizePolicy(sizePolicy1) - self.lineEdit_z5.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_z5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z5, 4, 5, 1, 1) - - self.lineEdit_u5 = QLineEdit(self.frame_28) - self.lineEdit_u5.setObjectName(u"lineEdit_u5") - sizePolicy1.setHeightForWidth(self.lineEdit_u5.sizePolicy().hasHeightForWidth()) - self.lineEdit_u5.setSizePolicy(sizePolicy1) - self.lineEdit_u5.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_u5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u5, 4, 7, 1, 1) - - self.pushButton_set_p4 = QPushButton(self.frame_28) - self.pushButton_set_p4.setObjectName(u"pushButton_set_p4") - sizePolicy5.setHeightForWidth(self.pushButton_set_p4.sizePolicy().hasHeightForWidth()) - self.pushButton_set_p4.setSizePolicy(sizePolicy5) - self.pushButton_set_p4.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_set_p4, 3, 13, 1, 1) - - self.label_21 = QLabel(self.frame_28) - self.label_21.setObjectName(u"label_21") - sizePolicy4.setHeightForWidth(self.label_21.sizePolicy().hasHeightForWidth()) - self.label_21.setSizePolicy(sizePolicy4) - self.label_21.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_21, 2, 2, 1, 1) - - self.label_41 = QLabel(self.frame_28) - self.label_41.setObjectName(u"label_41") - sizePolicy4.setHeightForWidth(self.label_41.sizePolicy().hasHeightForWidth()) - self.label_41.setSizePolicy(sizePolicy4) - self.label_41.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_41, 1, 10, 1, 1) - - self.label_44 = QLabel(self.frame_28) - self.label_44.setObjectName(u"label_44") - sizePolicy4.setHeightForWidth(self.label_44.sizePolicy().hasHeightForWidth()) - self.label_44.setSizePolicy(sizePolicy4) - self.label_44.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_44, 2, 6, 1, 1) - - self.pushButton_get_p4 = QPushButton(self.frame_28) - self.pushButton_get_p4.setObjectName(u"pushButton_get_p4") - sizePolicy5.setHeightForWidth(self.pushButton_get_p4.sizePolicy().hasHeightForWidth()) - self.pushButton_get_p4.setSizePolicy(sizePolicy5) - self.pushButton_get_p4.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_get_p4, 3, 12, 1, 1) - - self.label_50 = QLabel(self.frame_28) - self.label_50.setObjectName(u"label_50") - sizePolicy4.setHeightForWidth(self.label_50.sizePolicy().hasHeightForWidth()) - self.label_50.setSizePolicy(sizePolicy4) - self.label_50.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_50, 4, 10, 1, 1) - - self.label_25 = QLabel(self.frame_28) - self.label_25.setObjectName(u"label_25") - sizePolicy4.setHeightForWidth(self.label_25.sizePolicy().hasHeightForWidth()) - self.label_25.setSizePolicy(sizePolicy4) - self.label_25.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_25, 4, 4, 1, 1) - - self.lineEdit_w1 = QLineEdit(self.frame_28) - self.lineEdit_w1.setObjectName(u"lineEdit_w1") - sizePolicy1.setHeightForWidth(self.lineEdit_w1.sizePolicy().hasHeightForWidth()) - self.lineEdit_w1.setSizePolicy(sizePolicy1) - self.lineEdit_w1.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_w1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w1, 0, 11, 1, 1) - - self.lineEdit_x5 = QLineEdit(self.frame_28) - self.lineEdit_x5.setObjectName(u"lineEdit_x5") - sizePolicy1.setHeightForWidth(self.lineEdit_x5.sizePolicy().hasHeightForWidth()) - self.lineEdit_x5.setSizePolicy(sizePolicy1) - self.lineEdit_x5.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_x5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x5, 4, 1, 1, 1) - - self.lineEdit_y5 = QLineEdit(self.frame_28) - self.lineEdit_y5.setObjectName(u"lineEdit_y5") - sizePolicy1.setHeightForWidth(self.lineEdit_y5.sizePolicy().hasHeightForWidth()) - self.lineEdit_y5.setSizePolicy(sizePolicy1) - self.lineEdit_y5.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_y5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y5, 4, 3, 1, 1) - - self.lineEdit_w4 = QLineEdit(self.frame_28) - self.lineEdit_w4.setObjectName(u"lineEdit_w4") - sizePolicy1.setHeightForWidth(self.lineEdit_w4.sizePolicy().hasHeightForWidth()) - self.lineEdit_w4.setSizePolicy(sizePolicy1) - self.lineEdit_w4.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_w4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w4, 3, 11, 1, 1) - - self.label_40 = QLabel(self.frame_28) - self.label_40.setObjectName(u"label_40") - sizePolicy4.setHeightForWidth(self.label_40.sizePolicy().hasHeightForWidth()) - self.label_40.setSizePolicy(sizePolicy4) - self.label_40.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_40, 1, 8, 1, 1) - - self.label_43 = QLabel(self.frame_28) - self.label_43.setObjectName(u"label_43") - sizePolicy4.setHeightForWidth(self.label_43.sizePolicy().hasHeightForWidth()) - self.label_43.setSizePolicy(sizePolicy4) - self.label_43.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_43, 2, 10, 1, 1) - - self.lineEdit_v4 = QLineEdit(self.frame_28) - self.lineEdit_v4.setObjectName(u"lineEdit_v4") - sizePolicy1.setHeightForWidth(self.lineEdit_v4.sizePolicy().hasHeightForWidth()) - self.lineEdit_v4.setSizePolicy(sizePolicy1) - self.lineEdit_v4.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_v4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v4, 3, 9, 1, 1) - - self.lineEdit_u1 = QLineEdit(self.frame_28) - self.lineEdit_u1.setObjectName(u"lineEdit_u1") - sizePolicy1.setHeightForWidth(self.lineEdit_u1.sizePolicy().hasHeightForWidth()) - self.lineEdit_u1.setSizePolicy(sizePolicy1) - self.lineEdit_u1.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_u1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u1, 0, 7, 1, 1) - - self.lineEdit_y1 = QLineEdit(self.frame_28) - self.lineEdit_y1.setObjectName(u"lineEdit_y1") - sizePolicy1.setHeightForWidth(self.lineEdit_y1.sizePolicy().hasHeightForWidth()) - self.lineEdit_y1.setSizePolicy(sizePolicy1) - self.lineEdit_y1.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_y1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y1, 0, 3, 1, 1) - - self.label_37 = QLabel(self.frame_28) - self.label_37.setObjectName(u"label_37") - sizePolicy4.setHeightForWidth(self.label_37.sizePolicy().hasHeightForWidth()) - self.label_37.setSizePolicy(sizePolicy4) - self.label_37.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_37, 0, 10, 1, 1) - - self.lineEdit_w2 = QLineEdit(self.frame_28) - self.lineEdit_w2.setObjectName(u"lineEdit_w2") - sizePolicy1.setHeightForWidth(self.lineEdit_w2.sizePolicy().hasHeightForWidth()) - self.lineEdit_w2.setSizePolicy(sizePolicy1) - self.lineEdit_w2.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_w2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w2, 1, 11, 1, 1) - - self.pushButton_set_p5 = QPushButton(self.frame_28) - self.pushButton_set_p5.setObjectName(u"pushButton_set_p5") - sizePolicy5.setHeightForWidth(self.pushButton_set_p5.sizePolicy().hasHeightForWidth()) - self.pushButton_set_p5.setSizePolicy(sizePolicy5) - self.pushButton_set_p5.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_set_p5, 4, 13, 1, 1) - - self.pushButton_set_p3 = QPushButton(self.frame_28) - self.pushButton_set_p3.setObjectName(u"pushButton_set_p3") - sizePolicy5.setHeightForWidth(self.pushButton_set_p3.sizePolicy().hasHeightForWidth()) - self.pushButton_set_p3.setSizePolicy(sizePolicy5) - self.pushButton_set_p3.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_set_p3, 2, 13, 1, 1) - - self.label_26 = QLabel(self.frame_28) - self.label_26.setObjectName(u"label_26") - sizePolicy4.setHeightForWidth(self.label_26.sizePolicy().hasHeightForWidth()) - self.label_26.setSizePolicy(sizePolicy4) - self.label_26.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_26, 4, 2, 1, 1) - - self.label_19 = QLabel(self.frame_28) - self.label_19.setObjectName(u"label_19") - sizePolicy4.setHeightForWidth(self.label_19.sizePolicy().hasHeightForWidth()) - self.label_19.setSizePolicy(sizePolicy4) - self.label_19.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_19, 2, 0, 1, 1) - - self.lineEdit_y4 = QLineEdit(self.frame_28) - self.lineEdit_y4.setObjectName(u"lineEdit_y4") - sizePolicy1.setHeightForWidth(self.lineEdit_y4.sizePolicy().hasHeightForWidth()) - self.lineEdit_y4.setSizePolicy(sizePolicy1) - self.lineEdit_y4.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_y4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y4, 3, 3, 1, 1) - - self.label_42 = QLabel(self.frame_28) - self.label_42.setObjectName(u"label_42") - sizePolicy4.setHeightForWidth(self.label_42.sizePolicy().hasHeightForWidth()) - self.label_42.setSizePolicy(sizePolicy4) - self.label_42.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_42, 2, 8, 1, 1) - - self.lineEdit_u4 = QLineEdit(self.frame_28) - self.lineEdit_u4.setObjectName(u"lineEdit_u4") - sizePolicy1.setHeightForWidth(self.lineEdit_u4.sizePolicy().hasHeightForWidth()) - self.lineEdit_u4.setSizePolicy(sizePolicy1) - self.lineEdit_u4.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_u4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u4, 3, 7, 1, 1) - - self.lineEdit_z4 = QLineEdit(self.frame_28) - self.lineEdit_z4.setObjectName(u"lineEdit_z4") - sizePolicy1.setHeightForWidth(self.lineEdit_z4.sizePolicy().hasHeightForWidth()) - self.lineEdit_z4.setSizePolicy(sizePolicy1) - self.lineEdit_z4.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_z4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z4, 3, 5, 1, 1) - - self.lineEdit_x3 = QLineEdit(self.frame_28) - self.lineEdit_x3.setObjectName(u"lineEdit_x3") - sizePolicy1.setHeightForWidth(self.lineEdit_x3.sizePolicy().hasHeightForWidth()) - self.lineEdit_x3.setSizePolicy(sizePolicy1) - self.lineEdit_x3.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_x3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x3, 2, 1, 1, 1) - - self.label_18 = QLabel(self.frame_28) - self.label_18.setObjectName(u"label_18") - sizePolicy4.setHeightForWidth(self.label_18.sizePolicy().hasHeightForWidth()) - self.label_18.setSizePolicy(sizePolicy4) - self.label_18.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_18, 1, 2, 1, 1) - - self.label_48 = QLabel(self.frame_28) - self.label_48.setObjectName(u"label_48") - sizePolicy4.setHeightForWidth(self.label_48.sizePolicy().hasHeightForWidth()) - self.label_48.setSizePolicy(sizePolicy4) - self.label_48.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_48, 4, 8, 1, 1) - - self.label_38 = QLabel(self.frame_28) - self.label_38.setObjectName(u"label_38") - sizePolicy4.setHeightForWidth(self.label_38.sizePolicy().hasHeightForWidth()) - self.label_38.setSizePolicy(sizePolicy4) - self.label_38.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_38, 0, 8, 1, 1) - - self.lineEdit_y3 = QLineEdit(self.frame_28) - self.lineEdit_y3.setObjectName(u"lineEdit_y3") - sizePolicy1.setHeightForWidth(self.lineEdit_y3.sizePolicy().hasHeightForWidth()) - self.lineEdit_y3.setSizePolicy(sizePolicy1) - self.lineEdit_y3.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_y3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y3, 2, 3, 1, 1) - - self.pushButton_get_p5 = QPushButton(self.frame_28) - self.pushButton_get_p5.setObjectName(u"pushButton_get_p5") - sizePolicy5.setHeightForWidth(self.pushButton_get_p5.sizePolicy().hasHeightForWidth()) - self.pushButton_get_p5.setSizePolicy(sizePolicy5) - self.pushButton_get_p5.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_get_p5, 4, 12, 1, 1) - - self.label_20 = QLabel(self.frame_28) - self.label_20.setObjectName(u"label_20") - sizePolicy4.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth()) - self.label_20.setSizePolicy(sizePolicy4) - self.label_20.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_20, 2, 4, 1, 1) - - self.label_27 = QLabel(self.frame_28) - self.label_27.setObjectName(u"label_27") - sizePolicy4.setHeightForWidth(self.label_27.sizePolicy().hasHeightForWidth()) - self.label_27.setSizePolicy(sizePolicy4) - self.label_27.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_27, 4, 0, 1, 1) - - self.label_22 = QLabel(self.frame_28) - self.label_22.setObjectName(u"label_22") - sizePolicy4.setHeightForWidth(self.label_22.sizePolicy().hasHeightForWidth()) - self.label_22.setSizePolicy(sizePolicy4) - self.label_22.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_22, 3, 0, 1, 1) - - self.label_46 = QLabel(self.frame_28) - self.label_46.setObjectName(u"label_46") - sizePolicy4.setHeightForWidth(self.label_46.sizePolicy().hasHeightForWidth()) - self.label_46.setSizePolicy(sizePolicy4) - self.label_46.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_46, 3, 10, 1, 1) - - self.label_14 = QLabel(self.frame_28) - self.label_14.setObjectName(u"label_14") - sizePolicy4.setHeightForWidth(self.label_14.sizePolicy().hasHeightForWidth()) - self.label_14.setSizePolicy(sizePolicy4) - self.label_14.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_14, 0, 2, 1, 1) - - self.label_15 = QLabel(self.frame_28) - self.label_15.setObjectName(u"label_15") - sizePolicy4.setHeightForWidth(self.label_15.sizePolicy().hasHeightForWidth()) - self.label_15.setSizePolicy(sizePolicy4) - self.label_15.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_15, 0, 4, 1, 1) - - self.lineEdit_z3 = QLineEdit(self.frame_28) - self.lineEdit_z3.setObjectName(u"lineEdit_z3") - sizePolicy1.setHeightForWidth(self.lineEdit_z3.sizePolicy().hasHeightForWidth()) - self.lineEdit_z3.setSizePolicy(sizePolicy1) - self.lineEdit_z3.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_z3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z3, 2, 5, 1, 1) - - self.label_39 = QLabel(self.frame_28) - self.label_39.setObjectName(u"label_39") - sizePolicy4.setHeightForWidth(self.label_39.sizePolicy().hasHeightForWidth()) - self.label_39.setSizePolicy(sizePolicy4) - self.label_39.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_39, 1, 6, 1, 1) - - self.label_23 = QLabel(self.frame_28) - self.label_23.setObjectName(u"label_23") - sizePolicy4.setHeightForWidth(self.label_23.sizePolicy().hasHeightForWidth()) - self.label_23.setSizePolicy(sizePolicy4) - self.label_23.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_23, 3, 2, 1, 1) - - self.lineEdit_z2 = QLineEdit(self.frame_28) - self.lineEdit_z2.setObjectName(u"lineEdit_z2") - sizePolicy1.setHeightForWidth(self.lineEdit_z2.sizePolicy().hasHeightForWidth()) - self.lineEdit_z2.setSizePolicy(sizePolicy1) - self.lineEdit_z2.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_z2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z2, 1, 5, 1, 1) - - self.label_9 = QLabel(self.frame_28) - self.label_9.setObjectName(u"label_9") - sizePolicy4.setHeightForWidth(self.label_9.sizePolicy().hasHeightForWidth()) - self.label_9.setSizePolicy(sizePolicy4) - self.label_9.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_9, 0, 0, 1, 1) - - self.label_49 = QLabel(self.frame_28) - self.label_49.setObjectName(u"label_49") - sizePolicy4.setHeightForWidth(self.label_49.sizePolicy().hasHeightForWidth()) - self.label_49.setSizePolicy(sizePolicy4) - self.label_49.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_49, 4, 6, 1, 1) - - self.label_45 = QLabel(self.frame_28) - self.label_45.setObjectName(u"label_45") - sizePolicy4.setHeightForWidth(self.label_45.sizePolicy().hasHeightForWidth()) - self.label_45.setSizePolicy(sizePolicy4) - self.label_45.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_45, 3, 6, 1, 1) - - self.pushButton_get_p3 = QPushButton(self.frame_28) - self.pushButton_get_p3.setObjectName(u"pushButton_get_p3") - sizePolicy5.setHeightForWidth(self.pushButton_get_p3.sizePolicy().hasHeightForWidth()) - self.pushButton_get_p3.setSizePolicy(sizePolicy5) - self.pushButton_get_p3.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_get_p3, 2, 12, 1, 1) - - self.lineEdit_v3 = QLineEdit(self.frame_28) - self.lineEdit_v3.setObjectName(u"lineEdit_v3") - sizePolicy1.setHeightForWidth(self.lineEdit_v3.sizePolicy().hasHeightForWidth()) - self.lineEdit_v3.setSizePolicy(sizePolicy1) - self.lineEdit_v3.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_v3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v3, 2, 9, 1, 1) - - self.lineEdit_x4 = QLineEdit(self.frame_28) - self.lineEdit_x4.setObjectName(u"lineEdit_x4") - sizePolicy1.setHeightForWidth(self.lineEdit_x4.sizePolicy().hasHeightForWidth()) - self.lineEdit_x4.setSizePolicy(sizePolicy1) - self.lineEdit_x4.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_x4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x4, 3, 1, 1, 1) - - self.label_47 = QLabel(self.frame_28) - self.label_47.setObjectName(u"label_47") - sizePolicy4.setHeightForWidth(self.label_47.sizePolicy().hasHeightForWidth()) - self.label_47.setSizePolicy(sizePolicy4) - self.label_47.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_47, 3, 8, 1, 1) - - self.pushButton_get_p1 = QPushButton(self.frame_28) - self.pushButton_get_p1.setObjectName(u"pushButton_get_p1") - sizePolicy5.setHeightForWidth(self.pushButton_get_p1.sizePolicy().hasHeightForWidth()) - self.pushButton_get_p1.setSizePolicy(sizePolicy5) - self.pushButton_get_p1.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_get_p1, 0, 12, 1, 1) - - self.lineEdit_u2 = QLineEdit(self.frame_28) - self.lineEdit_u2.setObjectName(u"lineEdit_u2") - sizePolicy1.setHeightForWidth(self.lineEdit_u2.sizePolicy().hasHeightForWidth()) - self.lineEdit_u2.setSizePolicy(sizePolicy1) - self.lineEdit_u2.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_u2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u2, 1, 7, 1, 1) - - self.lineEdit_z1 = QLineEdit(self.frame_28) - self.lineEdit_z1.setObjectName(u"lineEdit_z1") - sizePolicy1.setHeightForWidth(self.lineEdit_z1.sizePolicy().hasHeightForWidth()) - self.lineEdit_z1.setSizePolicy(sizePolicy1) - self.lineEdit_z1.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_z1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z1, 0, 5, 1, 1) - - self.pushButton_set_p2 = QPushButton(self.frame_28) - self.pushButton_set_p2.setObjectName(u"pushButton_set_p2") - sizePolicy5.setHeightForWidth(self.pushButton_set_p2.sizePolicy().hasHeightForWidth()) - self.pushButton_set_p2.setSizePolicy(sizePolicy5) - self.pushButton_set_p2.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - - self.gridLayout_5.addWidget(self.pushButton_set_p2, 1, 13, 1, 1) - - self.label_24 = QLabel(self.frame_28) - self.label_24.setObjectName(u"label_24") - sizePolicy4.setHeightForWidth(self.label_24.sizePolicy().hasHeightForWidth()) - self.label_24.setSizePolicy(sizePolicy4) - self.label_24.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_24, 3, 4, 1, 1) - - self.lineEdit_w3 = QLineEdit(self.frame_28) - self.lineEdit_w3.setObjectName(u"lineEdit_w3") - sizePolicy1.setHeightForWidth(self.lineEdit_w3.sizePolicy().hasHeightForWidth()) - self.lineEdit_w3.setSizePolicy(sizePolicy1) - self.lineEdit_w3.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_w3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w3, 2, 11, 1, 1) - - self.lineEdit_u3 = QLineEdit(self.frame_28) - self.lineEdit_u3.setObjectName(u"lineEdit_u3") - sizePolicy1.setHeightForWidth(self.lineEdit_u3.sizePolicy().hasHeightForWidth()) - self.lineEdit_u3.setSizePolicy(sizePolicy1) - self.lineEdit_u3.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_u3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u3, 2, 7, 1, 1) - - self.label_36 = QLabel(self.frame_28) - self.label_36.setObjectName(u"label_36") - sizePolicy4.setHeightForWidth(self.label_36.sizePolicy().hasHeightForWidth()) - self.label_36.setSizePolicy(sizePolicy4) - self.label_36.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_36, 0, 6, 1, 1) - - self.label_17 = QLabel(self.frame_28) - self.label_17.setObjectName(u"label_17") - sizePolicy4.setHeightForWidth(self.label_17.sizePolicy().hasHeightForWidth()) - self.label_17.setSizePolicy(sizePolicy4) - self.label_17.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.gridLayout_5.addWidget(self.label_17, 1, 4, 1, 1) - - self.lineEdit_v2 = QLineEdit(self.frame_28) - self.lineEdit_v2.setObjectName(u"lineEdit_v2") - sizePolicy1.setHeightForWidth(self.lineEdit_v2.sizePolicy().hasHeightForWidth()) - self.lineEdit_v2.setSizePolicy(sizePolicy1) - self.lineEdit_v2.setStyleSheet(u"border:1px solid #FFFfff") - self.lineEdit_v2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v2, 1, 9, 1, 1) - - self.gridLayout_5.setRowStretch(0, 1) - self.gridLayout_5.setRowStretch(1, 1) - self.gridLayout_5.setRowStretch(2, 1) - self.gridLayout_5.setRowStretch(3, 1) - self.gridLayout_5.setRowStretch(4, 1) - self.gridLayout_5.setColumnStretch(0, 1) - self.gridLayout_5.setColumnStretch(1, 2) - self.gridLayout_5.setColumnStretch(2, 1) - self.gridLayout_5.setColumnStretch(3, 2) - self.gridLayout_5.setColumnStretch(4, 1) - self.gridLayout_5.setColumnStretch(5, 2) - self.gridLayout_5.setColumnStretch(6, 1) - self.gridLayout_5.setColumnStretch(7, 2) - self.gridLayout_5.setColumnStretch(8, 1) - self.gridLayout_5.setColumnStretch(9, 2) - self.gridLayout_5.setColumnStretch(10, 1) - self.gridLayout_5.setColumnStretch(11, 2) - self.gridLayout_5.setColumnStretch(12, 3) - self.gridLayout_5.setColumnStretch(13, 4) - - self.horizontalLayout_16.addWidget(self.frame_28) - - - self.verticalLayout_15.addWidget(self.frame_26) - - self.verticalLayout_15.setStretch(0, 1) - self.verticalLayout_15.setStretch(1, 1) - self.stackedWidget_view.addWidget(self.page_4) - self.page = QWidget() - self.page.setObjectName(u"page") - self.verticalLayout_17 = QVBoxLayout(self.page) - self.verticalLayout_17.setSpacing(0) - self.verticalLayout_17.setObjectName(u"verticalLayout_17") - self.verticalLayout_17.setContentsMargins(0, 0, 0, 0) - self.frame_8 = QFrame(self.page) - self.frame_8.setObjectName(u"frame_8") - self.frame_8.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_8.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_18 = QVBoxLayout(self.frame_8) - self.verticalLayout_18.setObjectName(u"verticalLayout_18") - self.lineEdit_setting_height1 = QFrame(self.frame_8) - self.lineEdit_setting_height1.setObjectName(u"lineEdit_setting_height1") - sizePolicy8 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum) - sizePolicy8.setHorizontalStretch(0) - sizePolicy8.setVerticalStretch(0) - sizePolicy8.setHeightForWidth(self.lineEdit_setting_height1.sizePolicy().hasHeightForWidth()) - self.lineEdit_setting_height1.setSizePolicy(sizePolicy8) - self.lineEdit_setting_height1.setFrameShape(QFrame.Shape.StyledPanel) - self.lineEdit_setting_height1.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_6 = QGridLayout(self.lineEdit_setting_height1) - self.gridLayout_6.setObjectName(u"gridLayout_6") - self.gridLayout_6.setHorizontalSpacing(0) - self.gridLayout_6.setVerticalSpacing(60) - self.gridLayout_6.setContentsMargins(0, 0, 0, 60) - self.pushButton_saveSeting = QPushButton(self.lineEdit_setting_height1) - self.pushButton_saveSeting.setObjectName(u"pushButton_saveSeting") - sizePolicy1.setHeightForWidth(self.pushButton_saveSeting.sizePolicy().hasHeightForWidth()) - self.pushButton_saveSeting.setSizePolicy(sizePolicy1) - self.pushButton_saveSeting.setStyleSheet(u"*{\n" -"background-color: #2196F3;\n" -"font: 20pt \"\u6977\u4f53\";\n" -"border:None;\n" -"color:#ffffff\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - self.pushButton_saveSeting.setFlat(False) - - self.gridLayout_6.addWidget(self.pushButton_saveSeting, 6, 0, 1, 4) - - self.lineEdit_speed_debug = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_speed_debug.setObjectName(u"lineEdit_speed_debug") - sizePolicy1.setHeightForWidth(self.lineEdit_speed_debug.sizePolicy().hasHeightForWidth()) - self.lineEdit_speed_debug.setSizePolicy(sizePolicy1) - self.lineEdit_speed_debug.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_speed_debug, 2, 1, 1, 1) - - self.label_51 = QLabel(self.lineEdit_setting_height1) - self.label_51.setObjectName(u"label_51") - sizePolicy4.setHeightForWidth(self.label_51.sizePolicy().hasHeightForWidth()) - self.label_51.setSizePolicy(sizePolicy4) - self.label_51.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_51, 0, 2, 1, 1) - - self.lineEdit_press_addr = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_press_addr.setObjectName(u"lineEdit_press_addr") - sizePolicy1.setHeightForWidth(self.lineEdit_press_addr.sizePolicy().hasHeightForWidth()) - self.lineEdit_press_addr.setSizePolicy(sizePolicy1) - self.lineEdit_press_addr.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_press_addr, 1, 3, 1, 1) - - self.label_54 = QLabel(self.lineEdit_setting_height1) - self.label_54.setObjectName(u"label_54") - sizePolicy4.setHeightForWidth(self.label_54.sizePolicy().hasHeightForWidth()) - self.label_54.setSizePolicy(sizePolicy4) - self.label_54.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_54, 2, 2, 1, 1) - - self.lineEdit_speed_run = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_speed_run.setObjectName(u"lineEdit_speed_run") - sizePolicy1.setHeightForWidth(self.lineEdit_speed_run.sizePolicy().hasHeightForWidth()) - self.lineEdit_speed_run.setSizePolicy(sizePolicy1) - self.lineEdit_speed_run.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_speed_run, 0, 1, 1, 1) - - self.lineEdit_speed_reset = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_speed_reset.setObjectName(u"lineEdit_speed_reset") - sizePolicy1.setHeightForWidth(self.lineEdit_speed_reset.sizePolicy().hasHeightForWidth()) - self.lineEdit_speed_reset.setSizePolicy(sizePolicy1) - self.lineEdit_speed_reset.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_speed_reset, 1, 1, 1, 1) - - self.lineEdit_shake_addr = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_shake_addr.setObjectName(u"lineEdit_shake_addr") - sizePolicy1.setHeightForWidth(self.lineEdit_shake_addr.sizePolicy().hasHeightForWidth()) - self.lineEdit_shake_addr.setSizePolicy(sizePolicy1) - self.lineEdit_shake_addr.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_shake_addr, 2, 3, 1, 1) - - self.lineEdit_timedelay_put = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_timedelay_put.setObjectName(u"lineEdit_timedelay_put") - sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_put.sizePolicy().hasHeightForWidth()) - self.lineEdit_timedelay_put.setSizePolicy(sizePolicy1) - self.lineEdit_timedelay_put.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_timedelay_put, 4, 1, 1, 1) - - self.label_85 = QLabel(self.lineEdit_setting_height1) - self.label_85.setObjectName(u"label_85") - sizePolicy4.setHeightForWidth(self.label_85.sizePolicy().hasHeightForWidth()) - self.label_85.setSizePolicy(sizePolicy4) - self.label_85.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_85, 3, 2, 1, 1) - - self.label_94 = QLabel(self.lineEdit_setting_height1) - self.label_94.setObjectName(u"label_94") - sizePolicy4.setHeightForWidth(self.label_94.sizePolicy().hasHeightForWidth()) - self.label_94.setSizePolicy(sizePolicy4) - self.label_94.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_94, 1, 0, 1, 1) - - self.lineEdit_timedelay_shake = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_timedelay_shake.setObjectName(u"lineEdit_timedelay_shake") - sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_shake.sizePolicy().hasHeightForWidth()) - self.lineEdit_timedelay_shake.setSizePolicy(sizePolicy1) - self.lineEdit_timedelay_shake.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_timedelay_shake, 3, 3, 1, 1) - - self.label_28 = QLabel(self.lineEdit_setting_height1) - self.label_28.setObjectName(u"label_28") - sizePolicy4.setHeightForWidth(self.label_28.sizePolicy().hasHeightForWidth()) - self.label_28.setSizePolicy(sizePolicy4) - self.label_28.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_28, 0, 0, 1, 1) - - self.lineEdit_setting_smooth = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_setting_smooth.setObjectName(u"lineEdit_setting_smooth") - sizePolicy1.setHeightForWidth(self.lineEdit_setting_smooth.sizePolicy().hasHeightForWidth()) - self.lineEdit_setting_smooth.setSizePolicy(sizePolicy1) - self.lineEdit_setting_smooth.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_setting_smooth, 4, 3, 1, 1) - - self.lineEdit_timedelay_take = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_timedelay_take.setObjectName(u"lineEdit_timedelay_take") - sizePolicy1.setHeightForWidth(self.lineEdit_timedelay_take.sizePolicy().hasHeightForWidth()) - self.lineEdit_timedelay_take.setSizePolicy(sizePolicy1) - self.lineEdit_timedelay_take.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_timedelay_take, 3, 1, 1, 1) - - self.lineEdit_setting_height = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_setting_height.setObjectName(u"lineEdit_setting_height") - sizePolicy1.setHeightForWidth(self.lineEdit_setting_height.sizePolicy().hasHeightForWidth()) - self.lineEdit_setting_height.setSizePolicy(sizePolicy1) - self.lineEdit_setting_height.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_setting_height, 5, 1, 1, 1) - - self.label_29 = QLabel(self.lineEdit_setting_height1) - self.label_29.setObjectName(u"label_29") - sizePolicy4.setHeightForWidth(self.label_29.sizePolicy().hasHeightForWidth()) - self.label_29.setSizePolicy(sizePolicy4) - self.label_29.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_29, 2, 0, 1, 1) - - self.label_87 = QLabel(self.lineEdit_setting_height1) - self.label_87.setObjectName(u"label_87") - sizePolicy4.setHeightForWidth(self.label_87.sizePolicy().hasHeightForWidth()) - self.label_87.setSizePolicy(sizePolicy4) - self.label_87.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_87, 3, 0, 1, 1) - - self.lineEdit_take_addr = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_take_addr.setObjectName(u"lineEdit_take_addr") - sizePolicy1.setHeightForWidth(self.lineEdit_take_addr.sizePolicy().hasHeightForWidth()) - self.lineEdit_take_addr.setSizePolicy(sizePolicy1) - self.lineEdit_take_addr.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_take_addr, 0, 3, 1, 1) - - self.label_52 = QLabel(self.lineEdit_setting_height1) - self.label_52.setObjectName(u"label_52") - sizePolicy4.setHeightForWidth(self.label_52.sizePolicy().hasHeightForWidth()) - self.label_52.setSizePolicy(sizePolicy4) - self.label_52.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_52, 1, 2, 1, 1) - - self.label_89 = QLabel(self.lineEdit_setting_height1) - self.label_89.setObjectName(u"label_89") - sizePolicy4.setHeightForWidth(self.label_89.sizePolicy().hasHeightForWidth()) - self.label_89.setSizePolicy(sizePolicy4) - self.label_89.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_89, 4, 2, 1, 1) - - self.label_86 = QLabel(self.lineEdit_setting_height1) - self.label_86.setObjectName(u"label_86") - sizePolicy4.setHeightForWidth(self.label_86.sizePolicy().hasHeightForWidth()) - self.label_86.setSizePolicy(sizePolicy4) - self.label_86.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_86, 4, 0, 1, 1) - - self.label_96 = QLabel(self.lineEdit_setting_height1) - self.label_96.setObjectName(u"label_96") - sizePolicy4.setHeightForWidth(self.label_96.sizePolicy().hasHeightForWidth()) - self.label_96.setSizePolicy(sizePolicy4) - self.label_96.setStyleSheet(u"color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_96, 5, 0, 1, 1) - - self.gridLayout_6.setRowStretch(0, 1) - self.gridLayout_6.setRowStretch(1, 1) - self.gridLayout_6.setRowStretch(2, 1) - self.gridLayout_6.setRowStretch(3, 1) - self.gridLayout_6.setRowStretch(4, 1) - self.gridLayout_6.setRowStretch(5, 1) - self.gridLayout_6.setRowStretch(6, 1) - - self.verticalLayout_18.addWidget(self.lineEdit_setting_height1) - - self.verticalLayout_18.setStretch(0, 7) - - self.verticalLayout_17.addWidget(self.frame_8) - - self.stackedWidget_view.addWidget(self.page) - self.page_2 = QWidget() - self.page_2.setObjectName(u"page_2") - self.verticalLayout_19 = QVBoxLayout(self.page_2) - self.verticalLayout_19.setSpacing(0) - self.verticalLayout_19.setObjectName(u"verticalLayout_19") - self.verticalLayout_19.setContentsMargins(0, 0, 0, 0) - self.frame_30 = QFrame(self.page_2) - self.frame_30.setObjectName(u"frame_30") - self.frame_30.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_30.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_17 = QHBoxLayout(self.frame_30) - self.horizontalLayout_17.setSpacing(0) - self.horizontalLayout_17.setObjectName(u"horizontalLayout_17") - self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0) - self.frame_31 = QFrame(self.frame_30) - self.frame_31.setObjectName(u"frame_31") - self.frame_31.setStyleSheet(u"background-color: rgb(85, 170, 255);") - self.frame_31.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_31.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_7 = QGridLayout(self.frame_31) - self.gridLayout_7.setObjectName(u"gridLayout_7") - self.lineEdit_j6 = QLineEdit(self.frame_31) - self.lineEdit_j6.setObjectName(u"lineEdit_j6") - - self.gridLayout_7.addWidget(self.lineEdit_j6, 14, 7, 1, 1) - - self.pushButton_j3_add = QPushButton(self.frame_31) - self.pushButton_j3_add.setObjectName(u"pushButton_j3_add") - self.pushButton_j3_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - icon6 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListAdd)) - self.pushButton_j3_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j3_add, 8, 6, 1, 1) - - self.lineEdit_j2 = QLineEdit(self.frame_31) - self.lineEdit_j2.setObjectName(u"lineEdit_j2") - - self.gridLayout_7.addWidget(self.lineEdit_j2, 6, 7, 1, 1) - - self.horizontalSlider_J3 = QSlider(self.frame_31) - self.horizontalSlider_J3.setObjectName(u"horizontalSlider_J3") - self.horizontalSlider_J3.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J3, 8, 2, 1, 4) - - self.pushButton_j5_add = QPushButton(self.frame_31) - self.pushButton_j5_add.setObjectName(u"pushButton_j5_add") - self.pushButton_j5_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j5_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j5_add, 12, 6, 1, 1) - - self.pushButton_j6_sub = QPushButton(self.frame_31) - self.pushButton_j6_sub.setObjectName(u"pushButton_j6_sub") - self.pushButton_j6_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - icon7 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListRemove)) - self.pushButton_j6_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j6_sub, 14, 1, 1, 1) - - self.label_34 = QLabel(self.frame_31) - self.label_34.setObjectName(u"label_34") - self.label_34.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - - self.gridLayout_7.addWidget(self.label_34, 12, 0, 1, 1) - - self.pushButton_j6_add = QPushButton(self.frame_31) - self.pushButton_j6_add.setObjectName(u"pushButton_j6_add") - self.pushButton_j6_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j6_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j6_add, 14, 6, 1, 1) - - self.label_j5_max = QLabel(self.frame_31) - self.label_j5_max.setObjectName(u"label_j5_max") - - self.gridLayout_7.addWidget(self.label_j5_max, 11, 5, 1, 1) - - self.lineEdit_j4 = QLineEdit(self.frame_31) - self.lineEdit_j4.setObjectName(u"lineEdit_j4") - - self.gridLayout_7.addWidget(self.lineEdit_j4, 10, 7, 1, 1) - - self.pushButton_j2_add = QPushButton(self.frame_31) - self.pushButton_j2_add.setObjectName(u"pushButton_j2_add") - self.pushButton_j2_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j2_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j2_add, 6, 6, 1, 1) - - self.lineEdit_j3 = QLineEdit(self.frame_31) - self.lineEdit_j3.setObjectName(u"lineEdit_j3") - - self.gridLayout_7.addWidget(self.lineEdit_j3, 8, 7, 1, 1) - - self.horizontalSlider_J1 = QSlider(self.frame_31) - self.horizontalSlider_J1.setObjectName(u"horizontalSlider_J1") - self.horizontalSlider_J1.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J1, 4, 2, 1, 4) - - self.label_j1 = QLabel(self.frame_31) - self.label_j1.setObjectName(u"label_j1") - - self.gridLayout_7.addWidget(self.label_j1, 3, 4, 1, 1) - - self.label_j2_min = QLabel(self.frame_31) - self.label_j2_min.setObjectName(u"label_j2_min") - - self.gridLayout_7.addWidget(self.label_j2_min, 5, 2, 1, 2) - - self.lineEdit_j5 = QLineEdit(self.frame_31) - self.lineEdit_j5.setObjectName(u"lineEdit_j5") - - self.gridLayout_7.addWidget(self.lineEdit_j5, 12, 7, 1, 1) - - self.label_j5_min = QLabel(self.frame_31) - self.label_j5_min.setObjectName(u"label_j5_min") - - self.gridLayout_7.addWidget(self.label_j5_min, 11, 2, 1, 2) - - self.label_30 = QLabel(self.frame_31) - self.label_30.setObjectName(u"label_30") - self.label_30.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - - self.gridLayout_7.addWidget(self.label_30, 4, 0, 1, 1) - - self.label_j6_min = QLabel(self.frame_31) - self.label_j6_min.setObjectName(u"label_j6_min") - - self.gridLayout_7.addWidget(self.label_j6_min, 13, 2, 1, 2) - - self.label_j3_min = QLabel(self.frame_31) - self.label_j3_min.setObjectName(u"label_j3_min") - - self.gridLayout_7.addWidget(self.label_j3_min, 7, 2, 1, 2) - - self.horizontalSlider_J4 = QSlider(self.frame_31) - self.horizontalSlider_J4.setObjectName(u"horizontalSlider_J4") - self.horizontalSlider_J4.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J4, 10, 2, 1, 4) - - self.label_j3_max = QLabel(self.frame_31) - self.label_j3_max.setObjectName(u"label_j3_max") - - self.gridLayout_7.addWidget(self.label_j3_max, 7, 5, 1, 1) - - self.pushButton_j3_sub = QPushButton(self.frame_31) - self.pushButton_j3_sub.setObjectName(u"pushButton_j3_sub") - self.pushButton_j3_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j3_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j3_sub, 8, 1, 1, 1) - - self.pushButton_j4_sub = QPushButton(self.frame_31) - self.pushButton_j4_sub.setObjectName(u"pushButton_j4_sub") - self.pushButton_j4_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j4_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j4_sub, 10, 1, 1, 1) - - self.pushButton_j1_add = QPushButton(self.frame_31) - self.pushButton_j1_add.setObjectName(u"pushButton_j1_add") - self.pushButton_j1_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(0, 255, 0);\n" -"}\n" -"") - self.pushButton_j1_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j1_add, 4, 6, 1, 1) - - self.label_j4_min = QLabel(self.frame_31) - self.label_j4_min.setObjectName(u"label_j4_min") - - self.gridLayout_7.addWidget(self.label_j4_min, 9, 2, 1, 2) - - self.pushButton_j1_sub = QPushButton(self.frame_31) - self.pushButton_j1_sub.setObjectName(u"pushButton_j1_sub") - self.pushButton_j1_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j1_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j1_sub, 4, 1, 1, 1) - - self.pushButton_sendMove = QPushButton(self.frame_31) - self.pushButton_sendMove.setObjectName(u"pushButton_sendMove") - self.pushButton_sendMove.setStyleSheet(u"*{\n" -"background-color: #007AD9;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border:6px solid #55AAFF;\n" -"color:#ffffff\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - - self.gridLayout_7.addWidget(self.pushButton_sendMove, 15, 0, 1, 8) - - self.horizontalSlider_J2 = QSlider(self.frame_31) - self.horizontalSlider_J2.setObjectName(u"horizontalSlider_J2") - self.horizontalSlider_J2.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J2, 6, 2, 1, 4) - - self.horizontalSlider_J5 = QSlider(self.frame_31) - self.horizontalSlider_J5.setObjectName(u"horizontalSlider_J5") - self.horizontalSlider_J5.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J5, 12, 2, 1, 4) - - self.label_j1_max = QLabel(self.frame_31) - self.label_j1_max.setObjectName(u"label_j1_max") - - self.gridLayout_7.addWidget(self.label_j1_max, 3, 5, 1, 1) - - self.label_j3 = QLabel(self.frame_31) - self.label_j3.setObjectName(u"label_j3") - - self.gridLayout_7.addWidget(self.label_j3, 7, 4, 1, 1) - - self.pushButton_j5_sub = QPushButton(self.frame_31) - self.pushButton_j5_sub.setObjectName(u"pushButton_j5_sub") - self.pushButton_j5_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j5_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j5_sub, 12, 1, 1, 1) - - self.label_j6_max = QLabel(self.frame_31) - self.label_j6_max.setObjectName(u"label_j6_max") - - self.gridLayout_7.addWidget(self.label_j6_max, 13, 5, 1, 1) - - self.label_j5 = QLabel(self.frame_31) - self.label_j5.setObjectName(u"label_j5") - - self.gridLayout_7.addWidget(self.label_j5, 11, 4, 1, 1) - - self.label_35 = QLabel(self.frame_31) - self.label_35.setObjectName(u"label_35") - self.label_35.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - - self.gridLayout_7.addWidget(self.label_35, 14, 0, 1, 1) - - self.lineEdit_j1 = QLineEdit(self.frame_31) - self.lineEdit_j1.setObjectName(u"lineEdit_j1") - - self.gridLayout_7.addWidget(self.lineEdit_j1, 4, 7, 1, 1) - - self.label_j2_max = QLabel(self.frame_31) - self.label_j2_max.setObjectName(u"label_j2_max") - - self.gridLayout_7.addWidget(self.label_j2_max, 5, 5, 1, 1) - - self.label_32 = QLabel(self.frame_31) - self.label_32.setObjectName(u"label_32") - self.label_32.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - - self.gridLayout_7.addWidget(self.label_32, 8, 0, 1, 1) - - self.pushButton_j4_add = QPushButton(self.frame_31) - self.pushButton_j4_add.setObjectName(u"pushButton_j4_add") - self.pushButton_j4_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j4_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j4_add, 10, 6, 1, 1) - - self.label_j6 = QLabel(self.frame_31) - self.label_j6.setObjectName(u"label_j6") - - self.gridLayout_7.addWidget(self.label_j6, 13, 4, 1, 1) - - self.label_j1_min = QLabel(self.frame_31) - self.label_j1_min.setObjectName(u"label_j1_min") - - self.gridLayout_7.addWidget(self.label_j1_min, 3, 2, 1, 1) - - self.label_j4 = QLabel(self.frame_31) - self.label_j4.setObjectName(u"label_j4") - - self.gridLayout_7.addWidget(self.label_j4, 9, 4, 1, 1) - - self.pushButton_j2_sub = QPushButton(self.frame_31) - self.pushButton_j2_sub.setObjectName(u"pushButton_j2_sub") - self.pushButton_j2_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j2_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j2_sub, 6, 1, 1, 1) - - self.label_j2 = QLabel(self.frame_31) - self.label_j2.setObjectName(u"label_j2") - - self.gridLayout_7.addWidget(self.label_j2, 5, 4, 1, 1) - - self.label_31 = QLabel(self.frame_31) - self.label_31.setObjectName(u"label_31") - self.label_31.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - - self.gridLayout_7.addWidget(self.label_31, 6, 0, 1, 1) - - self.label_manual_adjust_accuracy = QLabel(self.frame_31) - self.label_manual_adjust_accuracy.setObjectName(u"label_manual_adjust_accuracy") - - self.gridLayout_7.addWidget(self.label_manual_adjust_accuracy, 0, 2, 1, 1) - - self.label_j4_max = QLabel(self.frame_31) - self.label_j4_max.setObjectName(u"label_j4_max") - - self.gridLayout_7.addWidget(self.label_j4_max, 9, 5, 1, 1) - - self.label_33 = QLabel(self.frame_31) - self.label_33.setObjectName(u"label_33") - self.label_33.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - - self.gridLayout_7.addWidget(self.label_33, 10, 0, 1, 1) - - self.horizontalSlider_J6 = QSlider(self.frame_31) - self.horizontalSlider_J6.setObjectName(u"horizontalSlider_J6") - self.horizontalSlider_J6.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J6, 14, 2, 1, 4) - - self.lineEdit_manual_adjust_accuracy = QLineEdit(self.frame_31) - self.lineEdit_manual_adjust_accuracy.setObjectName(u"lineEdit_manual_adjust_accuracy") - - self.gridLayout_7.addWidget(self.lineEdit_manual_adjust_accuracy, 0, 3, 1, 1) - - self.gridLayout_7.setColumnStretch(0, 1) - self.gridLayout_7.setColumnStretch(1, 1) - self.gridLayout_7.setColumnStretch(2, 1) - self.gridLayout_7.setColumnStretch(3, 6) - self.gridLayout_7.setColumnStretch(4, 1) - self.gridLayout_7.setColumnStretch(5, 1) - self.gridLayout_7.setColumnStretch(6, 1) - self.gridLayout_7.setColumnStretch(7, 2) - - self.horizontalLayout_17.addWidget(self.frame_31) - - - self.verticalLayout_19.addWidget(self.frame_30) - - self.stackedWidget_view.addWidget(self.page_2) - self.page_8 = QWidget() - self.page_8.setObjectName(u"page_8") - self.verticalLayout_22 = QVBoxLayout(self.page_8) - self.verticalLayout_22.setSpacing(0) - self.verticalLayout_22.setObjectName(u"verticalLayout_22") - self.verticalLayout_22.setContentsMargins(0, 0, 0, 0) - self.frame_16 = QFrame(self.page_8) - self.frame_16.setObjectName(u"frame_16") - self.frame_16.setStyleSheet(u"color: rgb(255, 255, 255);") - self.frame_16.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_16.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_23 = QVBoxLayout(self.frame_16) - self.verticalLayout_23.setObjectName(u"verticalLayout_23") - self.pushButton_savePosition = QPushButton(self.frame_16) - self.pushButton_savePosition.setObjectName(u"pushButton_savePosition") - self.pushButton_savePosition.setStyleSheet(u"color: rgb(255, 255, 255);\n" -"background-color: rgb(0, 85, 0);") - - self.verticalLayout_23.addWidget(self.pushButton_savePosition) - - self.label_table_line_title = QLabel(self.frame_16) - self.label_table_line_title.setObjectName(u"label_table_line_title") - self.label_table_line_title.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.verticalLayout_23.addWidget(self.label_table_line_title) - - self.tableWidget_lines = QTableWidget(self.frame_16) - self.tableWidget_lines.setObjectName(u"tableWidget_lines") - self.tableWidget_lines.setStyleSheet(u" QHeaderView::section {\n" -" background-color: #2C2C2C; /* \u8868\u5934\u80cc\u666f\u8272 */\n" -" color: white; /* \u8868\u5934\u5b57\u4f53\u989c\u8272 */\n" -" font-size: 14px; /* \u5b57\u4f53\u5927\u5c0f */\n" -" font-weight: bold; /* \u5b57\u4f53\u52a0\u7c97 */\n" -" border: 1px solid black; /* \u8fb9\u6846\u989c\u8272 */\n" -" padding: 4px; /* \u5185\u8fb9\u8ddd */\n" -" }") - - self.verticalLayout_23.addWidget(self.tableWidget_lines) - - self.label_table_line_position_title = QLabel(self.frame_16) - self.label_table_line_position_title.setObjectName(u"label_table_line_position_title") - self.label_table_line_position_title.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.verticalLayout_23.addWidget(self.label_table_line_position_title) - - self.tableWidget_line_positions = QTableWidget(self.frame_16) - self.tableWidget_line_positions.setObjectName(u"tableWidget_line_positions") - self.tableWidget_line_positions.setStyleSheet(u" QHeaderView::section {\n" -" background-color: #2C2C2C; /* \u8868\u5934\u80cc\u666f\u8272 */\n" -" color: white; /* \u8868\u5934\u5b57\u4f53\u989c\u8272 */\n" -" font-size: 14px; /* \u5b57\u4f53\u5927\u5c0f */\n" -" font-weight: bold; /* \u5b57\u4f53\u52a0\u7c97 */\n" -" border: 1px solid black; /* \u8fb9\u6846\u989c\u8272 */\n" -" padding: 4px; /* \u5185\u8fb9\u8ddd */\n" -" }") - - self.verticalLayout_23.addWidget(self.tableWidget_line_positions) - - - self.verticalLayout_22.addWidget(self.frame_16) - - self.stackedWidget_view.addWidget(self.page_8) - - self.verticalLayout_8.addWidget(self.stackedWidget_view) - - - self.horizontalLayout_4.addWidget(self.frame_view) - - self.frame_right = QFrame(self.frame_main) - self.frame_right.setObjectName(u"frame_right") - sizePolicy1.setHeightForWidth(self.frame_right.sizePolicy().hasHeightForWidth()) - self.frame_right.setSizePolicy(sizePolicy1) - self.frame_right.setStyleSheet(u"background-color: rgb(16, 21, 49);\n" -"border: 1px solid #122041;") - self.frame_right.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_right.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_10 = QVBoxLayout(self.frame_right) - self.verticalLayout_10.setSpacing(0) - self.verticalLayout_10.setObjectName(u"verticalLayout_10") - self.verticalLayout_10.setContentsMargins(0, 0, 0, 0) - self.frame_19 = QFrame(self.frame_right) - self.frame_19.setObjectName(u"frame_19") - self.frame_19.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_19.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_10 = QHBoxLayout(self.frame_19) - self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") - self.label_3 = QLabel(self.frame_19) - self.label_3.setObjectName(u"label_3") - self.label_3.setStyleSheet(u"border-image: url(:/main/Image/calendar.svg);") - self.label_3.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_10.addWidget(self.label_3) - - self.label_date = QLabel(self.frame_19) - self.label_date.setObjectName(u"label_date") - self.label_date.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_date.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_10.addWidget(self.label_date) - - self.label_time = QLabel(self.frame_19) - self.label_time.setObjectName(u"label_time") - self.label_time.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - - self.horizontalLayout_10.addWidget(self.label_time) - - self.horizontalLayout_10.setStretch(0, 1) - self.horizontalLayout_10.setStretch(1, 5) - self.horizontalLayout_10.setStretch(2, 5) - - self.verticalLayout_10.addWidget(self.frame_19) - - self.frame_20 = QFrame(self.frame_right) - self.frame_20.setObjectName(u"frame_20") - self.frame_20.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_20.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_11 = QVBoxLayout(self.frame_20) - self.verticalLayout_11.setObjectName(u"verticalLayout_11") - self.comboBox_lineIndex = QComboBox(self.frame_20) - self.comboBox_lineIndex.addItem("") - self.comboBox_lineIndex.addItem("") - self.comboBox_lineIndex.setObjectName(u"comboBox_lineIndex") - self.comboBox_lineIndex.setStyleSheet(u"QComboBox {\n" -" border-radius: 10px;\n" -" padding: 5px 5px 5px 5px;\n" -" background-color: #2c2c2c;\n" -" color: white;\n" -" border: 1px solid #474747;\n" -" min-width: 80px;\n" -"}\n" -"\n" -"\n" -"QComboBox::drop-down {\n" -" width: 0px;\n" -" border: none;\n" -"\n" -"}\n" -"\n" -"QComboBox::down-arrow {\n" -" image: none;\n" -"}\n" -"\n" -"QComboBox QAbstractItemView {\n" -" border-bottom-right-radius: 10px;\n" -" border-bottom-left-radius: 10px;\n" -" background-color: #D3D3D3;\n" -" border: 1px solid gray;\n" -" padding: 4px 4px 4px 4px;\n" -" outline: none;\n" -"}") - - self.verticalLayout_11.addWidget(self.comboBox_lineIndex) - - self.stackedWidget_num = QStackedWidget(self.frame_20) - self.stackedWidget_num.setObjectName(u"stackedWidget_num") - self.stackedWidget_num.setStyleSheet(u"border:none;") - self.page_5 = QWidget() - self.page_5.setObjectName(u"page_5") - self.horizontalLayout_18 = QHBoxLayout(self.page_5) - self.horizontalLayout_18.setSpacing(0) - self.horizontalLayout_18.setObjectName(u"horizontalLayout_18") - self.horizontalLayout_18.setContentsMargins(0, 0, 0, 0) - self.frame_23 = QFrame(self.page_5) - self.frame_23.setObjectName(u"frame_23") - self.frame_23.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_23.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout = QGridLayout(self.frame_23) - self.gridLayout.setObjectName(u"gridLayout") - self.pushButton_num1 = QPushButton(self.frame_23) - self.pushButton_num1.setObjectName(u"pushButton_num1") - sizePolicy1.setHeightForWidth(self.pushButton_num1.sizePolicy().hasHeightForWidth()) - self.pushButton_num1.setSizePolicy(sizePolicy1) - self.pushButton_num1.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num1, 0, 0, 1, 1) - - self.pushButton_num2 = QPushButton(self.frame_23) - self.pushButton_num2.setObjectName(u"pushButton_num2") - sizePolicy1.setHeightForWidth(self.pushButton_num2.sizePolicy().hasHeightForWidth()) - self.pushButton_num2.setSizePolicy(sizePolicy1) - self.pushButton_num2.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num2, 0, 1, 1, 1) - - self.pushButton_num3 = QPushButton(self.frame_23) - self.pushButton_num3.setObjectName(u"pushButton_num3") - sizePolicy1.setHeightForWidth(self.pushButton_num3.sizePolicy().hasHeightForWidth()) - self.pushButton_num3.setSizePolicy(sizePolicy1) - self.pushButton_num3.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num3, 0, 2, 1, 1) - - self.pushButton_num4 = QPushButton(self.frame_23) - self.pushButton_num4.setObjectName(u"pushButton_num4") - sizePolicy1.setHeightForWidth(self.pushButton_num4.sizePolicy().hasHeightForWidth()) - self.pushButton_num4.setSizePolicy(sizePolicy1) - self.pushButton_num4.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num4, 1, 0, 1, 1) - - self.pushButton_num5 = QPushButton(self.frame_23) - self.pushButton_num5.setObjectName(u"pushButton_num5") - sizePolicy1.setHeightForWidth(self.pushButton_num5.sizePolicy().hasHeightForWidth()) - self.pushButton_num5.setSizePolicy(sizePolicy1) - self.pushButton_num5.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num5, 1, 1, 1, 1) - - self.pushButton_num6 = QPushButton(self.frame_23) - self.pushButton_num6.setObjectName(u"pushButton_num6") - sizePolicy1.setHeightForWidth(self.pushButton_num6.sizePolicy().hasHeightForWidth()) - self.pushButton_num6.setSizePolicy(sizePolicy1) - self.pushButton_num6.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num6, 1, 2, 1, 1) - - self.lineEdit_num = QLineEdit(self.frame_23) - self.lineEdit_num.setObjectName(u"lineEdit_num") - sizePolicy1.setHeightForWidth(self.lineEdit_num.sizePolicy().hasHeightForWidth()) - self.lineEdit_num.setSizePolicy(sizePolicy1) - self.lineEdit_num.setStyleSheet(u"color: rgb(255, 255, 255);\n" -"border: 1px solid #dcdfe6;\n" -"font: 8pt \"Microsoft YaHei UI\";") - - self.gridLayout.addWidget(self.lineEdit_num, 2, 0, 1, 1) - - self.pushButton_num_confirm = QPushButton(self.frame_23) - self.pushButton_num_confirm.setObjectName(u"pushButton_num_confirm") - sizePolicy1.setHeightForWidth(self.pushButton_num_confirm.sizePolicy().hasHeightForWidth()) - self.pushButton_num_confirm.setSizePolicy(sizePolicy1) - self.pushButton_num_confirm.setStyleSheet(u"\n" -"*{background-color: #101F3F;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"color:#ffffff\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - - self.gridLayout.addWidget(self.pushButton_num_confirm, 2, 1, 1, 2) - - self.gridLayout.setColumnStretch(0, 1) - self.gridLayout.setColumnStretch(1, 1) - self.gridLayout.setColumnStretch(2, 1) - - self.horizontalLayout_18.addWidget(self.frame_23) - - self.stackedWidget_num.addWidget(self.page_5) - self.page_6 = QWidget() - self.page_6.setObjectName(u"page_6") - self.verticalLayout_20 = QVBoxLayout(self.page_6) - self.verticalLayout_20.setSpacing(0) - self.verticalLayout_20.setObjectName(u"verticalLayout_20") - self.verticalLayout_20.setContentsMargins(0, 0, 0, 0) - self.frame_32 = QFrame(self.page_6) - self.frame_32.setObjectName(u"frame_32") - self.frame_32.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_32.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_21 = QVBoxLayout(self.frame_32) - self.verticalLayout_21.setObjectName(u"verticalLayout_21") - self.pushButton_AddNum = QPushButton(self.frame_32) - self.pushButton_AddNum.setObjectName(u"pushButton_AddNum") - sizePolicy5.setHeightForWidth(self.pushButton_AddNum.sizePolicy().hasHeightForWidth()) - self.pushButton_AddNum.setSizePolicy(sizePolicy5) - self.pushButton_AddNum.setStyleSheet(u"*{\n" -"background-color: #499C54;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - self.pushButton_AddNum.setIcon(icon6) - - self.verticalLayout_21.addWidget(self.pushButton_AddNum) - - self.pushButton_SubNum = QPushButton(self.frame_32) - self.pushButton_SubNum.setObjectName(u"pushButton_SubNum") - sizePolicy5.setHeightForWidth(self.pushButton_SubNum.sizePolicy().hasHeightForWidth()) - self.pushButton_SubNum.setSizePolicy(sizePolicy5) - self.pushButton_SubNum.setStyleSheet(u"*{\n" -"background-color: rgb(255, 0, 0);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - self.pushButton_SubNum.setIcon(icon7) - - self.verticalLayout_21.addWidget(self.pushButton_SubNum) - - - self.verticalLayout_20.addWidget(self.frame_32) - - self.stackedWidget_num.addWidget(self.page_6) - - self.verticalLayout_11.addWidget(self.stackedWidget_num) - - - self.verticalLayout_10.addWidget(self.frame_20) - - self.frame_21 = QFrame(self.frame_right) - self.frame_21.setObjectName(u"frame_21") - sizePolicy4.setHeightForWidth(self.frame_21.sizePolicy().hasHeightForWidth()) - self.frame_21.setSizePolicy(sizePolicy4) - self.frame_21.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_21.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_2 = QGridLayout(self.frame_21) - self.gridLayout_2.setObjectName(u"gridLayout_2") - self.pushButton_reset = QPushButton(self.frame_21) - self.pushButton_reset.setObjectName(u"pushButton_reset") - sizePolicy5.setHeightForWidth(self.pushButton_reset.sizePolicy().hasHeightForWidth()) - self.pushButton_reset.setSizePolicy(sizePolicy5) - self.pushButton_reset.setStyleSheet(u"*{\n" -"background-color: #FFFFBF;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #FFF000;\n" -"}\n" -"") - icon8 = QIcon(QIcon.fromTheme(u"media-optical")) - self.pushButton_reset.setIcon(icon8) - - self.gridLayout_2.addWidget(self.pushButton_reset, 2, 1, 1, 2) - - self.pushButton_emergency = QPushButton(self.frame_21) - self.pushButton_emergency.setObjectName(u"pushButton_emergency") - sizePolicy5.setHeightForWidth(self.pushButton_emergency.sizePolicy().hasHeightForWidth()) - self.pushButton_emergency.setSizePolicy(sizePolicy5) - self.pushButton_emergency.setStyleSheet(u"*{\n" -"background-color: #FFF000;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.WindowClose)) - self.pushButton_emergency.setIcon(icon9) - - self.gridLayout_2.addWidget(self.pushButton_emergency, 3, 0, 1, 1) - - self.pushButton_stopFeed = QPushButton(self.frame_21) - self.pushButton_stopFeed.setObjectName(u"pushButton_stopFeed") - sizePolicy5.setHeightForWidth(self.pushButton_stopFeed.sizePolicy().hasHeightForWidth()) - self.pushButton_stopFeed.setSizePolicy(sizePolicy5) - self.pushButton_stopFeed.setStyleSheet(u"*{\n" -"background-color: #FF0000;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon10 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemShutdown)) - self.pushButton_stopFeed.setIcon(icon10) - - self.gridLayout_2.addWidget(self.pushButton_stopFeed, 2, 0, 1, 1) - - self.pushButton_pauseFeed = QPushButton(self.frame_21) - self.pushButton_pauseFeed.setObjectName(u"pushButton_pauseFeed") - sizePolicy5.setHeightForWidth(self.pushButton_pauseFeed.sizePolicy().hasHeightForWidth()) - self.pushButton_pauseFeed.setSizePolicy(sizePolicy5) - self.pushButton_pauseFeed.setStyleSheet(u"*{\n" -"background-color: #2196F3;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon11 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause)) - self.pushButton_pauseFeed.setIcon(icon11) - - self.gridLayout_2.addWidget(self.pushButton_pauseFeed, 1, 1, 1, 2) - - self.pushButton_startFeed = QPushButton(self.frame_21) - self.pushButton_startFeed.setObjectName(u"pushButton_startFeed") - sizePolicy5.setHeightForWidth(self.pushButton_startFeed.sizePolicy().hasHeightForWidth()) - self.pushButton_startFeed.setSizePolicy(sizePolicy5) - self.pushButton_startFeed.setStyleSheet(u"*{\n" -"background-color: #499C54;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon12 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart)) - self.pushButton_startFeed.setIcon(icon12) - - self.gridLayout_2.addWidget(self.pushButton_startFeed, 1, 0, 1, 1) - - self.pushButton_clearAlarm = QPushButton(self.frame_21) - self.pushButton_clearAlarm.setObjectName(u"pushButton_clearAlarm") - sizePolicy5.setHeightForWidth(self.pushButton_clearAlarm.sizePolicy().hasHeightForWidth()) - self.pushButton_clearAlarm.setSizePolicy(sizePolicy5) - self.pushButton_clearAlarm.setStyleSheet(u"*{\n" -"background-color: #1CB2B1;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color:#1cb052;\n" -"}\n" -"\n" -"") - icon13 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot)) - self.pushButton_clearAlarm.setIcon(icon13) - - self.gridLayout_2.addWidget(self.pushButton_clearAlarm, 3, 1, 1, 2) - - self.pushButton_onekeyfeed = QPushButton(self.frame_21) - self.pushButton_onekeyfeed.setObjectName(u"pushButton_onekeyfeed") - sizePolicy5.setHeightForWidth(self.pushButton_onekeyfeed.sizePolicy().hasHeightForWidth()) - self.pushButton_onekeyfeed.setSizePolicy(sizePolicy5) - self.pushButton_onekeyfeed.setStyleSheet(u"*{\n" -"background-color: rgb(0, 170, 0);\n" -"\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color:#1cb052;\n" -"}\n" -"\n" -"") - icon14 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentSend)) - self.pushButton_onekeyfeed.setIcon(icon14) - self.pushButton_onekeyfeed.setIconSize(QSize(20, 20)) - - self.gridLayout_2.addWidget(self.pushButton_onekeyfeed, 0, 0, 1, 2) - - self.gridLayout_2.setRowStretch(0, 2) - self.gridLayout_2.setRowStretch(1, 2) - self.gridLayout_2.setRowStretch(2, 2) - self.gridLayout_2.setRowStretch(3, 2) - self.gridLayout_2.setColumnStretch(0, 1) - self.gridLayout_2.setColumnStretch(1, 1) - self.gridLayout_2.setRowMinimumHeight(0, 2) - self.gridLayout_2.setRowMinimumHeight(1, 2) - self.gridLayout_2.setRowMinimumHeight(2, 2) - - self.verticalLayout_10.addWidget(self.frame_21) - - self.frame_22 = QFrame(self.frame_right) - self.frame_22.setObjectName(u"frame_22") - self.frame_22.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_22.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_12 = QVBoxLayout(self.frame_22) - self.verticalLayout_12.setObjectName(u"verticalLayout_12") - self.horizontalSlider_feedingNum = QSlider(self.frame_22) - self.horizontalSlider_feedingNum.setObjectName(u"horizontalSlider_feedingNum") - self.horizontalSlider_feedingNum.setStyleSheet(u"/**QSlider\n" -"{\n" -" background-color: #FFFFFF; \n" -" border-style: outset; \n" -" border-radius:5px; \n" -"}\n" -" \n" -"QSlider::groove:horizontal\n" -"{\n" -" height: 10px;\n" -" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);\n" -" margin: 10px 0\n" -"}\n" -" \n" -"QSlider::handle:horizontal \n" -"{\n" -" background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green);\n" -" width: 10px;\n" -" height: 16px;\n" -" margin: -5px 3px -5px 6px;\n" -" border-radius:5px; \n" -" border: 3px solid #007900;\n" -"}\n" -"**/\n" -"/*\u7b2c\u4e00\u79cd\u98ce\u683c*/\n" -"/**\n" -" groove\u8868\u793a\u69fd\u7684\u90e8\u5206\n" -" handle\u8868\u793a\u6ed1\u5757\n" -" add-page\u8868\u793a\u672a\u6ed1\u8fc7\u7684\u69fd\u90e8\u5206\n" -" sub-page\u8868\u793a\u5df2\u6ed1\u8fc7\u7684\u69fd\u90e8\u5206\n" -" \u5728\u8f85\u52a9\u63a7\u5236\u5668\u540e\u9762\u53ef\u4ee5\u8bbe\u7f6e\u72b6\u6001\uff0chorizontal\u5c31\u662fQSS\u751f\u6548\u7684QSlider\u7684\u72b6\u6001\n" -"*" - "*/\n" -"\n" -"QSlider::groove:horizontal\n" -"{\n" -" height:10px;\n" -" border-radius: 5px;\n" -" background-color:rgb(219,219,219);\n" -"}\n" -"\n" -"\n" -"QSlider::handle:horizontal \n" -"{\n" -" background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green);\n" -" width: 5px;\n" -" height: 5px;\n" -" margin: -5px 3px -5px 6px;\n" -" border-radius:5px; \n" -" border: 3px solid #007900;\n" -"}\n" -"\n" -"QSlider::add-page:horizontal\n" -"{\n" -" border-radius: 5px;\n" -" background-color: rgb(219,219,219);\n" -"}\n" -" \n" -"QSlider::sub-page:horizontal\n" -"{\n" -" border-radius: 5px;\n" -" background-color: rgb(80,166,234);\n" -"}\n" -"\n" -"\n" -"\n" -"\n" -"\n" -"") - self.horizontalSlider_feedingNum.setOrientation(Qt.Orientation.Horizontal) - - self.verticalLayout_12.addWidget(self.horizontalSlider_feedingNum) - - self.frame_7 = QFrame(self.frame_22) - self.frame_7.setObjectName(u"frame_7") - self.frame_7.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_7.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_11 = QHBoxLayout(self.frame_7) - self.horizontalLayout_11.setObjectName(u"horizontalLayout_11") - self.label_4 = QLabel(self.frame_7) - self.label_4.setObjectName(u"label_4") - self.label_4.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_4.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.horizontalLayout_11.addWidget(self.label_4) - - self.label_maxNum = QLabel(self.frame_7) - self.label_maxNum.setObjectName(u"label_maxNum") - self.label_maxNum.setStyleSheet(u"color: rgb(255, 0, 0);\n" -"font: 36pt \"Microsoft YaHei UI\";") - self.label_maxNum.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_11.addWidget(self.label_maxNum) - - self.horizontalLayout_11.setStretch(0, 1) - self.horizontalLayout_11.setStretch(1, 5) - - self.verticalLayout_12.addWidget(self.frame_7) - - self.frame_24 = QFrame(self.frame_22) - self.frame_24.setObjectName(u"frame_24") - self.frame_24.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_24.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_12 = QHBoxLayout(self.frame_24) - self.horizontalLayout_12.setObjectName(u"horizontalLayout_12") - self.label_6 = QLabel(self.frame_24) - self.label_6.setObjectName(u"label_6") - self.label_6.setStyleSheet(u"color: rgb(255, 255, 255);") - self.label_6.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - - self.horizontalLayout_12.addWidget(self.label_6) - - self.label_remain_num = QLabel(self.frame_24) - self.label_remain_num.setObjectName(u"label_remain_num") - self.label_remain_num.setStyleSheet(u"color: rgb(0, 255, 0);\n" -"font: 36pt \"Microsoft YaHei UI\";") - self.label_remain_num.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_12.addWidget(self.label_remain_num) - - self.horizontalLayout_12.setStretch(0, 1) - self.horizontalLayout_12.setStretch(1, 5) - - self.verticalLayout_12.addWidget(self.frame_24) - - - self.verticalLayout_10.addWidget(self.frame_22) - - self.verticalLayout_10.setStretch(0, 1) - self.verticalLayout_10.setStretch(1, 6) - self.verticalLayout_10.setStretch(2, 6) - self.verticalLayout_10.setStretch(3, 1) - - self.horizontalLayout_4.addWidget(self.frame_right) - - self.horizontalLayout_4.setStretch(0, 45) - self.horizontalLayout_4.setStretch(1, 137) - self.horizontalLayout_4.setStretch(2, 59) - - self.verticalLayout.addWidget(self.frame_main) - - self.verticalLayout.setStretch(0, 1) - self.verticalLayout.setStretch(1, 11) - MainWindow.setCentralWidget(self.centralwidget) - - self.retranslateUi(MainWindow) - - self.stackedWidget_view.setCurrentIndex(3) - self.tabWidget.setCurrentIndex(0) - self.stackedWidget_num.setCurrentIndex(0) - - - QMetaObject.connectSlotsByName(MainWindow) - # setupUi - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u7231\u6765\u7c73\u4e1a", None)) - self.label.setText("") - self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u7231\u6765\u7c73\u4e1a\u7801\u579b\u7cfb\u7edf", None)) - self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u6295\u6599\u4e2d\u5fc3", None)) - self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"\u634f\u5408\u4e2d\u5fc3", None)) - self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"\u6210\u54c1", None)) - self.pushButton_4.setText(QCoreApplication.translate("MainWindow", u"\u63a7\u5236\u4e2d\u5fc3", None)) - self.pushButton_5.setText(QCoreApplication.translate("MainWindow", u"\u767b\u5f55", None)) - self.pushButton_exit.setText(QCoreApplication.translate("MainWindow", u"\u9000\u51fa", None)) - self.pushButton_sysseting.setText(QCoreApplication.translate("MainWindow", u"\u7cfb\u7edf\u8bbe\u7f6e", None)) - self.pushButton_leftmenu_produce.setText(QCoreApplication.translate("MainWindow", u"\u751f\u4ea7\u754c\u9762", None)) - self.pushButton_leftmenu_robot_seting.setText(QCoreApplication.translate("MainWindow", u"\u673a\u68b0\u81c2\u57fa\u7840\u8bbe\u7f6e", None)) - self.pushButton_leftmenu_IO.setText(QCoreApplication.translate("MainWindow", u"IO\u9762\u677f", None)) - self.pushButton_leftmenu_position.setText(QCoreApplication.translate("MainWindow", u"\u4f4d\u7f6e\u8bbe\u5b9a", None)) - self.pushButton_leftmenu_baseSeting.setText(QCoreApplication.translate("MainWindow", u"\u57fa\u7840\u8bbe\u7f6e", None)) - self.pushButton_leftmenu_posDebug.setText(QCoreApplication.translate("MainWindow", u"\u70b9\u4f4d\u8c03\u8bd5", None)) - self.pushButton_11.setText(QCoreApplication.translate("MainWindow", u"\u5176\u4ed6\u8bbe\u7f6e", None)) - self.pushButton_sign_go.setText("") - self.label_sign_go.setText(QCoreApplication.translate("MainWindow", u"\u53d6\u6599\u4e2d...", None)) - self.pushButton_sign_photo.setText("") - self.label_sign_photo.setText(QCoreApplication.translate("MainWindow", u"\u62cd\u7167\u4e2d...", None)) - self.pushButton_sign_take.setText("") - self.label_sign_take.setText(QCoreApplication.translate("MainWindow", u"\u6293\u6599\u4e2d...", None)) - self.pushButton_sign_feed.setText("") - self.label_sign_feed.setText(QCoreApplication.translate("MainWindow", u"\u6295\u6599\u4e2d...", None)) - self.label_showDetection.setText("") - self.label_move_sign.setText(QCoreApplication.translate("MainWindow", u"\u6b63\u5728\u79fb\u52a8", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u65e5\u5fd7", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u62a5\u8b66", None)) - self.label_53.setText(QCoreApplication.translate("MainWindow", u"\u8fde\u63a5\u72b6\u6001\uff1a", None)) - self.label_connect_status.setText("") - self.label_8.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u6a21\u5f0f\uff1a", None)) - self.label_status_model.setText(QCoreApplication.translate("MainWindow", u"\u81ea\u52a8", None)) - self.label_10.setText(QCoreApplication.translate("MainWindow", u"\u8fdc\u7a0b\u6307\u4ee4\u6570\u91cf\uff1a", None)) - self.label_status_remoteCmdLen.setText(QCoreApplication.translate("MainWindow", u"0", None)) - self.label_13.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u901f\u5ea6\uff1a", None)) - self.label_status_speed.setText(QCoreApplication.translate("MainWindow", u"0", None)) - self.label_11.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u5de5\u5177\u53f7\uff1a", None)) - self.label_status_toolIndex.setText(QCoreApplication.translate("MainWindow", u"1", None)) - self.label_12.setText(QCoreApplication.translate("MainWindow", u"\u62a5\u8b66\u4ee3\u7801\uff1a", None)) - self.label_status_alarmcode.setText(QCoreApplication.translate("MainWindow", u"200", None)) - self.label_5.setText(QCoreApplication.translate("MainWindow", u"Y1", None)) - self.label_57.setText(QCoreApplication.translate("MainWindow", u"2", None)) - self.label_58.setText(QCoreApplication.translate("MainWindow", u"3", None)) - self.label_59.setText(QCoreApplication.translate("MainWindow", u"4", None)) - self.label_7.setText(QCoreApplication.translate("MainWindow", u"5", None)) - self.label_61.setText(QCoreApplication.translate("MainWindow", u"6", None)) - self.label_62.setText(QCoreApplication.translate("MainWindow", u"7", None)) - self.label_60.setText(QCoreApplication.translate("MainWindow", u"8", None)) - self.label_55.setText(QCoreApplication.translate("MainWindow", u"9", None)) - self.label_65.setText(QCoreApplication.translate("MainWindow", u"10", None)) - self.label_64.setText(QCoreApplication.translate("MainWindow", u"11", None)) - self.label_63.setText(QCoreApplication.translate("MainWindow", u"12", None)) - self.label_56.setText(QCoreApplication.translate("MainWindow", u"13", None)) - self.label_68.setText(QCoreApplication.translate("MainWindow", u"14", None)) - self.label_67.setText(QCoreApplication.translate("MainWindow", u"15", None)) - self.label_66.setText(QCoreApplication.translate("MainWindow", u"16", None)) - self.label_69.setText(QCoreApplication.translate("MainWindow", u"17", None)) - self.label_81.setText(QCoreApplication.translate("MainWindow", u"18", None)) - self.label_82.setText(QCoreApplication.translate("MainWindow", u"19", None)) - self.label_78.setText(QCoreApplication.translate("MainWindow", u"20", None)) - self.label_72.setText(QCoreApplication.translate("MainWindow", u"21", None)) - self.label_84.setText(QCoreApplication.translate("MainWindow", u"22", None)) - self.label_77.setText(QCoreApplication.translate("MainWindow", u"23", None)) - self.label_71.setText(QCoreApplication.translate("MainWindow", u"24", None)) - self.label_70.setText(QCoreApplication.translate("MainWindow", u"25", None)) - self.label_80.setText(QCoreApplication.translate("MainWindow", u"26", None)) - self.label_74.setText(QCoreApplication.translate("MainWindow", u"27", None)) - self.label_73.setText(QCoreApplication.translate("MainWindow", u"28", None)) - self.label_75.setText(QCoreApplication.translate("MainWindow", u"29", None)) - self.label_76.setText(QCoreApplication.translate("MainWindow", u"30", None)) - self.label_83.setText(QCoreApplication.translate("MainWindow", u"31", None)) - self.label_79.setText(QCoreApplication.translate("MainWindow", u"32", None)) - self.label_92.setText(QCoreApplication.translate("MainWindow", u"V1:", None)) - self.label_88.setText(QCoreApplication.translate("MainWindow", u"Z1:", None)) - self.label_93.setText(QCoreApplication.translate("MainWindow", u"Y1:", None)) - self.label_95.setText(QCoreApplication.translate("MainWindow", u"U1:", None)) - self.label_90.setText(QCoreApplication.translate("MainWindow", u"X1:", None)) - self.label_91.setText(QCoreApplication.translate("MainWindow", u"W1:", None)) - self.pushButton_get_origin.setText(QCoreApplication.translate("MainWindow", u"\u83b7\u53d6\u539f\u70b9", None)) - self.pushButton_set_origin.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58\u539f\u70b9", None)) - self.pushButton_get_p2.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d2", None)) - self.pushButton_set_p1.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d1", None)) - self.label_16.setText(QCoreApplication.translate("MainWindow", u"X2:", None)) - self.pushButton_set_p4.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d4", None)) - self.label_21.setText(QCoreApplication.translate("MainWindow", u"Y3:", None)) - self.label_41.setText(QCoreApplication.translate("MainWindow", u"W2:", None)) - self.label_44.setText(QCoreApplication.translate("MainWindow", u"U3:", None)) - self.pushButton_get_p4.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d4", None)) - self.label_50.setText(QCoreApplication.translate("MainWindow", u"W5:", None)) - self.label_25.setText(QCoreApplication.translate("MainWindow", u"Z5:", None)) - self.label_40.setText(QCoreApplication.translate("MainWindow", u"V2:", None)) - self.label_43.setText(QCoreApplication.translate("MainWindow", u"W3:", None)) - self.label_37.setText(QCoreApplication.translate("MainWindow", u"W1:", None)) - self.pushButton_set_p5.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d5", None)) - self.pushButton_set_p3.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d3", None)) - self.label_26.setText(QCoreApplication.translate("MainWindow", u"Y5:", None)) - self.label_19.setText(QCoreApplication.translate("MainWindow", u"X3:", None)) - self.label_42.setText(QCoreApplication.translate("MainWindow", u"V3:", None)) - self.label_18.setText(QCoreApplication.translate("MainWindow", u"Y2:", None)) - self.label_48.setText(QCoreApplication.translate("MainWindow", u"V5:", None)) - self.label_38.setText(QCoreApplication.translate("MainWindow", u"V1:", None)) - self.pushButton_get_p5.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d5", None)) - self.label_20.setText(QCoreApplication.translate("MainWindow", u"Z3:", None)) - self.label_27.setText(QCoreApplication.translate("MainWindow", u"X5:", None)) - self.label_22.setText(QCoreApplication.translate("MainWindow", u"X4:", None)) - self.label_46.setText(QCoreApplication.translate("MainWindow", u"W4:", None)) - self.label_14.setText(QCoreApplication.translate("MainWindow", u"Y1:", None)) - self.label_15.setText(QCoreApplication.translate("MainWindow", u"Z1:", None)) - self.label_39.setText(QCoreApplication.translate("MainWindow", u"U2:", None)) - self.label_23.setText(QCoreApplication.translate("MainWindow", u"Y4:", None)) - self.label_9.setText(QCoreApplication.translate("MainWindow", u"X1:", None)) - self.label_49.setText(QCoreApplication.translate("MainWindow", u"U5:", None)) - self.label_45.setText(QCoreApplication.translate("MainWindow", u"U4:", None)) - self.pushButton_get_p3.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d3", None)) - self.label_47.setText(QCoreApplication.translate("MainWindow", u"V4:", None)) - self.pushButton_get_p1.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d1", None)) - self.pushButton_set_p2.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d2", None)) - self.label_24.setText(QCoreApplication.translate("MainWindow", u"Z4:", None)) - self.label_36.setText(QCoreApplication.translate("MainWindow", u"U1:", None)) - self.label_17.setText(QCoreApplication.translate("MainWindow", u"Z2:", None)) - self.pushButton_saveSeting.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58\u8bbe\u7f6e", None)) - self.label_51.setText(QCoreApplication.translate("MainWindow", u"\u6293\u53d6\u70b9\u4f4d:", None)) - self.label_54.setText(QCoreApplication.translate("MainWindow", u"\u6447\u6643\u70b9\u4f4d:", None)) - self.label_85.setText(QCoreApplication.translate("MainWindow", u"\u6447\u6643\u5ef6\u65f6\uff1a", None)) - self.label_94.setText(QCoreApplication.translate("MainWindow", u"\u590d\u4f4d\u901f\u5ea6\uff1a", None)) - self.label_28.setText(QCoreApplication.translate("MainWindow", u"\u751f\u4ea7\u901f\u5ea6\uff1a", None)) - self.label_29.setText(QCoreApplication.translate("MainWindow", u"\u8c03\u8bd5\u901f\u5ea6\uff1a", None)) - self.label_87.setText(QCoreApplication.translate("MainWindow", u"\u6293\u53d6\u5ef6\u65f6\uff1a", None)) - self.label_52.setText(QCoreApplication.translate("MainWindow", u"\u629b\u888b\u70b9\u4f4d\uff1a", None)) - self.label_89.setText(QCoreApplication.translate("MainWindow", u"\u5e73\u6ed1\u7cfb\u6570\uff1a", None)) - self.label_86.setText(QCoreApplication.translate("MainWindow", u"\u629b\u888b\u5ef6\u65f6\uff1a", None)) - self.label_96.setText(QCoreApplication.translate("MainWindow", u"\u52a8\u6001\u9ad8\u5ea6\uff1a", None)) - self.pushButton_j3_add.setText("") - self.pushButton_j5_add.setText("") - self.pushButton_j6_sub.setText("") - self.label_34.setText(QCoreApplication.translate("MainWindow", u"J5", None)) - self.pushButton_j6_add.setText("") - self.label_j5_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.pushButton_j2_add.setText("") - self.label_j1.setText("") - self.label_j2_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j5_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_30.setText(QCoreApplication.translate("MainWindow", u"J1", None)) - self.label_j6_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j3_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j3_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.pushButton_j3_sub.setText("") - self.pushButton_j4_sub.setText("") - self.pushButton_j1_add.setText("") - self.label_j4_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.pushButton_j1_sub.setText("") - self.pushButton_sendMove.setText(QCoreApplication.translate("MainWindow", u"\u786e\u5b9a\u79fb\u52a8", None)) - self.label_j1_max.setText(QCoreApplication.translate("MainWindow", u"+10", None)) - self.label_j3.setText("") - self.pushButton_j5_sub.setText("") - self.label_j6_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_j5.setText("") - self.label_35.setText(QCoreApplication.translate("MainWindow", u"J6", None)) - self.label_j2_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_32.setText(QCoreApplication.translate("MainWindow", u"J3", None)) - self.pushButton_j4_add.setText("") - self.label_j6.setText("") - self.label_j1_min.setText(QCoreApplication.translate("MainWindow", u"-10", None)) - self.label_j4.setText("") - self.pushButton_j2_sub.setText("") - self.label_j2.setText("") - self.label_31.setText(QCoreApplication.translate("MainWindow", u"J2", None)) - self.label_manual_adjust_accuracy.setText(QCoreApplication.translate("MainWindow", u"\u8c03\u6574\u95f4\u9694\uff1a", None)) - self.label_j4_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_33.setText(QCoreApplication.translate("MainWindow", u"J4", None)) - self.lineEdit_manual_adjust_accuracy.setText(QCoreApplication.translate("MainWindow", u"1", None)) - self.lineEdit_manual_adjust_accuracy.setPlaceholderText(QCoreApplication.translate("MainWindow", u"0.001-20", None)) - self.pushButton_savePosition.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58", None)) - self.label_table_line_title.setText(QCoreApplication.translate("MainWindow", u"\u751f\u4ea7\u7ebf", None)) - self.label_table_line_position_title.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None)) - self.label_3.setText("") - self.label_date.setText(QCoreApplication.translate("MainWindow", u"2024-08-01", None)) - self.label_time.setText(QCoreApplication.translate("MainWindow", u"08:00:00", None)) - self.comboBox_lineIndex.setItemText(0, QCoreApplication.translate("MainWindow", u"1\u53f7\u7ebf", None)) - self.comboBox_lineIndex.setItemText(1, QCoreApplication.translate("MainWindow", u"\u65b0\u5efa\u7ebf", None)) - - self.comboBox_lineIndex.setCurrentText(QCoreApplication.translate("MainWindow", u"1\u53f7\u7ebf", None)) - self.pushButton_num1.setText(QCoreApplication.translate("MainWindow", u"10", None)) - self.pushButton_num2.setText(QCoreApplication.translate("MainWindow", u"20", None)) - self.pushButton_num3.setText(QCoreApplication.translate("MainWindow", u"30", None)) - self.pushButton_num4.setText(QCoreApplication.translate("MainWindow", u"40", None)) - self.pushButton_num5.setText(QCoreApplication.translate("MainWindow", u"50", None)) - self.pushButton_num6.setText(QCoreApplication.translate("MainWindow", u"60", None)) - self.lineEdit_num.setPlaceholderText(QCoreApplication.translate("MainWindow", u"\u4ece\u7b2c\u51e0\u5305\u5f00\u59cb", None)) - self.pushButton_num_confirm.setText(QCoreApplication.translate("MainWindow", u"\u786e\u5b9a", None)) - self.pushButton_AddNum.setText(QCoreApplication.translate("MainWindow", u"\u8865\u4e00\u888b", None)) - self.pushButton_SubNum.setText(QCoreApplication.translate("MainWindow", u"\u6263\u4e00\u888b", None)) - self.pushButton_reset.setText(QCoreApplication.translate("MainWindow", u"\u590d\u4f4d", None)) - self.pushButton_emergency.setText(QCoreApplication.translate("MainWindow", u"\u6025\u505c", None)) - self.pushButton_stopFeed.setText(QCoreApplication.translate("MainWindow", u"\u505c\u6b62", None)) - self.pushButton_pauseFeed.setText(QCoreApplication.translate("MainWindow", u"\u6682\u505c", None)) - self.pushButton_startFeed.setText(QCoreApplication.translate("MainWindow", u"\u542f\u52a8", None)) - self.pushButton_clearAlarm.setText(QCoreApplication.translate("MainWindow", u"\u6e05\u9664\u62a5\u8b66", None)) - self.pushButton_onekeyfeed.setText(QCoreApplication.translate("MainWindow", u"\u4e00\u952e\u6295\u6599", None)) - self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u7801\u579b\u888b\u6570\uff1a", None)) - self.label_maxNum.setText(QCoreApplication.translate("MainWindow", u"0", None)) - self.label_6.setText(QCoreApplication.translate("MainWindow", u"\u5df2\u6295\u888b\u6570\uff1a", None)) - self.label_remain_num.setText(QCoreApplication.translate("MainWindow", u"0", None)) - # retranslateUi - diff --git a/Mv3D/CameraUtil.py b/Mv3D/CameraUtil.py index 2cd588c..767a94d 100644 --- a/Mv3D/CameraUtil.py +++ b/Mv3D/CameraUtil.py @@ -14,7 +14,7 @@ class CameraUtil: def __init__(self): self.camera = None self.camera_type = "ip" - self.camera_ip = "192.168.0.234" + self.camera_ip = "192.168.0.125" self.camera_port = 554 self.camera_username = "admin" self.camera_password = "ailaimiye123" @@ -73,13 +73,13 @@ class CameraUtil: # 跳20帧,获取最新图像 frames_skipped = 0 - while frames_skipped < 20: + while frames_skipped < 1: # 检查总超时 if time.time() - start_time > total_timeout: print("捕获图像总超时") return None self.camera.grab() - time.sleep(0.05) # 稍微增加延迟,确保有新帧到达 + # time.sleep(0.05) # 稍微增加延迟,确保有新帧到达 frames_skipped += 1 # 尝试读取帧,使用同一超时计时器 diff --git a/Mv3D/Mv3dRgbdImport/Mv3dRgbdApi.py b/Mv3D/Mv3dRgbdImport/Mv3dRgbdApi.py index 41e5a04..ed37144 100644 --- a/Mv3D/Mv3dRgbdImport/Mv3dRgbdApi.py +++ b/Mv3D/Mv3dRgbdImport/Mv3dRgbdApi.py @@ -13,7 +13,8 @@ import platform Mv3dRgbdDll = None if platform.system() == "Linux": try: - Mv3dRgbdDll = cdll.LoadLibrary("/opt/Mv3dRgbdSDK/lib/aarch64/libMv3dRgbd.so") + print('未启用SDK') + # Mv3dRgbdDll = cdll.LoadLibrary("/opt/Mv3dRgbdSDK/lib/aarch64/libMv3dRgbd.so") except Exception as e: print(f"加载Linux库文件失败: {e}") else: diff --git a/Mv3D/calculate_diff2.py b/Mv3D/calculate_diff2.py index dca4129..fdd760c 100644 --- a/Mv3D/calculate_diff2.py +++ b/Mv3D/calculate_diff2.py @@ -1,6 +1,7 @@ import cv2 import numpy as np import os +#from rknnlite.api import RKNNLite # ====================== 配置区 ====================== @@ -23,6 +24,34 @@ print(f"Scale factors: SCALE_X={SCALE_X:.3f} mm/px, SCALE_Y={SCALE_Y:.3f} mm/px" # 输入尺寸 IMG_SIZE = (640, 640) +# ====================== RKNN 单例管理 ====================== +_rknn_instance = None + +def init_rknn_once(model_path): + """只加载一次 RKNN 模型""" + global _rknn_instance + if _rknn_instance is None: + _rknn_instance = RKNNLite(verbose=False) + ret = _rknn_instance.load_rknn(model_path) + if ret != 0: + print(f"[ERROR] Failed to load RKNN: {ret}") + _rknn_instance = None + return None + ret = _rknn_instance.init_runtime() + if ret != 0: + print(f"[ERROR] Failed to init RKNN runtime: {ret}") + _rknn_instance = None + return None + return _rknn_instance + +def release_rknn(): + """释放 RKNN 单例""" + global _rknn_instance + if _rknn_instance: + _rknn_instance.release() + _rknn_instance = None + +# ====================== 工具函数 ====================== def letterbox_resize(image, size, bg_color=114): target_w, target_h = size @@ -35,63 +64,43 @@ def letterbox_resize(image, size, bg_color=114): canvas[dy:dy + new_h, dx:dx + new_w] = resized return canvas, scale, dx, dy - def safe_sigmoid(x): x = np.clip(x, -50, 50) return 1.0 / (1.0 + np.exp(-x)) - def softmax(x): x = x - np.max(x) e = np.exp(x) return e / e.sum() - def dfl_to_xywh(loc, grid_x, grid_y, stride): - """将 DFL 输出解析为 xywh""" xywh_ = np.zeros(4) xywh = np.zeros(4) - - # 每个维度 16 bins 做 softmax for i in range(4): l = loc[i * 16:(i + 1) * 16] l = softmax(l) xywh_[i] = sum([j * l[j] for j in range(16)]) - - # 对应公式 xywh_[0] = (grid_x + 0.5) - xywh_[0] xywh_[1] = (grid_y + 0.5) - xywh_[1] xywh_[2] = (grid_x + 0.5) + xywh_[2] xywh_[3] = (grid_y + 0.5) + xywh_[3] - - # 转成中心点 + 宽高 xywh[0] = ((xywh_[0] + xywh_[2]) / 2) * stride xywh[1] = ((xywh_[1] + xywh_[3]) / 2) * stride xywh[2] = (xywh_[2] - xywh_[0]) * stride xywh[3] = (xywh_[3] - xywh_[1]) * stride - - # 转为左上角坐标 xywh[0] = xywh[0] - xywh[2] / 2 xywh[1] = xywh[1] - xywh[3] / 2 return xywh - def parse_pose_outputs(outputs, conf_threshold=0.5, dx=0, dy=0, scale=1.0): - """ - 完整解析 RKNN YOLO-Pose 输出 - 返回 keypoints, class_id, obj_conf, bbox(已映射回原图) - """ boxes = [] obj_confs = [] class_ids = [] - - # 遍历前三个输出 tensor (det 输出) for idx in range(3): - det = np.array(outputs[idx])[0] # (C,H,W) + det = np.array(outputs[idx])[0] C, H, W = det.shape - num_classes = C - 64 # 前64通道为 DFL bbox + num_classes = C - 64 stride = 640 // H - for h in range(H): for w in range(W): for c in range(num_classes): @@ -102,7 +111,6 @@ def parse_pose_outputs(outputs, conf_threshold=0.5, dx=0, dy=0, scale=1.0): boxes.append(xywh) obj_confs.append(conf) class_ids.append(c) - if not obj_confs: best_box = np.array([0, 0, 0, 0]) class_id = -1 @@ -112,21 +120,16 @@ def parse_pose_outputs(outputs, conf_threshold=0.5, dx=0, dy=0, scale=1.0): best_box = boxes[max_idx] class_id = class_ids[max_idx] obj_conf = obj_confs[max_idx] - - # 🔹 bbox 坐标映射回原图 x, y, w, h = best_box x = (x - dx) / scale y = (y - dy) / scale w = w / scale h = h / scale best_box = np.array([x, y, w, h]) - - # 🔹 关键点解析 - kpt_output = np.array(outputs[3])[0] # (num_kpts, 3, num_anchor) + kpt_output = np.array(outputs[3])[0] confs = kpt_output[:, 2, :] best_anchor_idx = np.argmax(np.mean(confs, axis=0)) kpt_data = kpt_output[:, :, best_anchor_idx] - keypoints = [] for i in range(kpt_data.shape[0]): x_img, y_img, vis_conf_raw = kpt_data[i] @@ -134,10 +137,8 @@ def parse_pose_outputs(outputs, conf_threshold=0.5, dx=0, dy=0, scale=1.0): x_orig = (x_img - dx) / scale y_orig = (y_img - dy) / scale keypoints.append([x_orig, y_orig, vis_prob]) - return np.array(keypoints), class_id, obj_conf, best_box - def compute_offset(keypoints, fixed_point, scale_x, scale_y): if len(keypoints) < 2: return None @@ -148,28 +149,19 @@ def compute_offset(keypoints, fixed_point, scale_x, scale_y): dy_mm = (cy - fixed_point[1]) * scale_y return cx, cy, dx_mm, dy_mm - def visualize_result(image, keypoints, bbox, fixed_point, offset_info, save_path): vis = image.copy() colors = [(0, 0, 255), (0, 255, 255)] cx, cy, dx_mm, dy_mm = offset_info fx, fy = map(int, fixed_point) - - # 绘制关键点 for i, (x, y, conf) in enumerate(keypoints[:2]): if conf > 0.5: cv2.circle(vis, (int(x), int(y)), 6, colors[i], -1) if len(keypoints) >= 2: - cv2.line(vis, - (int(keypoints[0][0]), int(keypoints[0][1])), - (int(keypoints[1][0]), int(keypoints[1][1])), - (0, 255, 0), 2) - - # 绘制 bbox + cv2.line(vis, (int(keypoints[0][0]), int(keypoints[0][1])), + (int(keypoints[1][0]), int(keypoints[1][1])), (0, 255, 0), 2) x, y, w, h = bbox cv2.rectangle(vis, (int(x), int(y)), (int(x + w), int(y + h)), (255, 0, 0), 2) - - # 绘制中心点 cv2.circle(vis, (int(cx), int(cy)), 10, (0, 255, 0), 3) cv2.circle(vis, (fx, fy), 12, (255, 255, 0), 3) cv2.arrowedLine(vis, (fx, fy), (int(cx), int(cy)), (255, 255, 0), 2, tipLength=0.05) @@ -177,30 +169,26 @@ def visualize_result(image, keypoints, bbox, fixed_point, offset_info, save_path cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2) cv2.putText(vis, f"DeltaY={dy_mm:+.1f}mm", (fx + 30, fy + 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2) - cv2.imwrite(save_path, vis) +# ====================== 主函数 ====================== def calculate_offset_from_image(image_path, visualize=False): - from rknnlite.api import RKNNLite - - orig = cv2.imread(image_path) + orig=cv2.imread(image_path) if orig is None: return {'success': False, 'message': f'Failed to load image: {image_path}'} img_resized, scale, dx, dy = letterbox_resize(orig, IMG_SIZE) infer_img = np.expand_dims(img_resized[..., ::-1], 0).astype(np.uint8) - rknn = RKNNLite(verbose=False) - ret = rknn.load_rknn(MODEL_PATH) - if ret != 0: - return {'success': False, 'message': 'Failed to load RKNN model'} + rknn = init_rknn_once(MODEL_PATH) + if rknn is None: + return {'success': False, 'message': 'Failed to init RKNN'} try: - rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0) outputs = rknn.inference([infer_img]) - finally: - rknn.release() + except Exception as e: + return {'success': False, 'message': f'RKNN inference error: {str(e)}'} try: keypoints, class_id, obj_conf, bbox = parse_pose_outputs(outputs, dx=dx, dy=dy, scale=scale) @@ -222,16 +210,40 @@ def calculate_offset_from_image(image_path, visualize=False): 'obj_conf': obj_conf, 'bbox': bbox, 'message': 'Success'} - -# ====================== 使用示例 ====================== +# ====================== 示例调用 ====================== if __name__ == "__main__": - image_path = "11.jpg" - result = calculate_offset_from_image(image_path, visualize=True) - if result['success']: - print(f"Center point: ({result['cx']:.1f}, {result['cy']:.1f})") - print(f"Offset: DeltaX={result['dx_mm']:+.2f} mm, DeltaY={result['dy_mm']:+.2f} mm") - print(f"Class ID: {result['class_id']}, Confidence: {result['obj_conf']:.3f}") - print(f"BBox: {result['bbox']}") - else: - print("Error:", result['message']) + time_start = time.time() + camera = CameraUtil() + + for i in range(5): + time_start = time.time() + image_path=camera.save_img() + time_end = time.time() + print(f"Time cost22: {time_end - time_start:.3f} s") + + # image_path = "11.jpg" + result = calculate_offset_from_image(image_path, visualize=False) + + + if result['success']: + print(f"Center point: ({result['cx']:.1f}, {result['cy']:.1f})") + print(f"Offset: DeltaX={result['dx_mm']:+.2f} mm, DeltaY={result['dy_mm']:+.2f} mm") + print(f"Class ID: {result['class_id']}, Confidence: {result['obj_conf']:.3f}") + print(f"BBox: {result['bbox']}") + else: + print("Error:", result['message']) + time_end = time.time() + print(f"Time cost: {time_end - time_start:.3f} s") + + # image_path = "11.jpg" + # orig = cv2.imread(image_path) + # result = calculate_offset_from_image(orig, visualize=False) + # if result['success']: + # print(f"Center point: ({result['cx']:.1f}, {result['cy']:.1f})") + # print(f"Offset: DeltaX={result['dx_mm']:+.2f} mm, DeltaY={result['dy_mm']:+.2f} mm") + # print(f"Class ID: {result['class_id']}, Confidence: {result['obj_conf']:.3f}") + # print(f"BBox: {result['bbox']}") + # else: + # print("Error:", result['message']) + diff --git a/Mv3D/point.rknn b/Mv3D/point.rknn index 64d89ccb7c81c6b36324cf512e5399f4b94a0eaf..8239f099e77f5da4a62969b25ce4d09fd0b07ccf 100644 GIT binary patch delta 125941 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 JO`HQB+8!?TGq}_!JvPR?+=GLLx@>~Ot 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�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 delta 125515 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 z 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


", None)) - self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), QCoreApplication.translate("MainWindow", u"\u65e5\u5fd7", None)) - self.textEdit_log_error.setHtml(QCoreApplication.translate("MainWindow", u"\n" -"\n" -"


", None)) - self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), QCoreApplication.translate("MainWindow", u"\u62a5\u8b66", None)) - self.label_move_sign.setText(QCoreApplication.translate("MainWindow", u"\u6b63\u5728\u79fb\u52a8", None)) - self.pushButton_startFeed.setText(QCoreApplication.translate("MainWindow", u"\u542f\u52a8", None)) - self.pushButton_pauseFeed.setText(QCoreApplication.translate("MainWindow", u"\u6682\u505c", None)) - self.pushButton_stopFeed.setText(QCoreApplication.translate("MainWindow", u"\u505c\u6b62", None)) - self.pushButton_reset.setText(QCoreApplication.translate("MainWindow", u"\u590d\u4f4d", None)) - self.pushButton_17.setText(QCoreApplication.translate("MainWindow", u"\u6025\u505c", None)) - self.pushButton_clearAlarm.setText(QCoreApplication.translate("MainWindow", u"\u6e05\u9664\u62a5\u8b66", None)) - self.tabWidget_control.setTabText(self.tabWidget_control.indexOf(self.tab_6), QCoreApplication.translate("MainWindow", u"\u751f\u4ea7\u754c\u9762", None)) - self.label_j1_min.setText(QCoreApplication.translate("MainWindow", u"-10", None)) - self.label_j1_max.setText(QCoreApplication.translate("MainWindow", u"+10", None)) - self.label_j2_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j2_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_j3_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j3_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_j5_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j5_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_j6_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j6_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_j4_min.setText(QCoreApplication.translate("MainWindow", u"-150", None)) - self.label_j4_max.setText(QCoreApplication.translate("MainWindow", u"150", None)) - self.label_26.setText(QCoreApplication.translate("MainWindow", u"J1", None)) - self.label_27.setText(QCoreApplication.translate("MainWindow", u"J2", None)) - self.label_28.setText(QCoreApplication.translate("MainWindow", u"J3", None)) - self.label_29.setText(QCoreApplication.translate("MainWindow", u"J4", None)) - self.label_30.setText(QCoreApplication.translate("MainWindow", u"J5", None)) - self.label_31.setText(QCoreApplication.translate("MainWindow", u"J6", None)) - self.pushButton_j1_add.setText("") - self.pushButton_j1_sub.setText("") - self.pushButton_j2_sub.setText("") - self.pushButton_j2_add.setText("") - self.pushButton_j3_sub.setText("") - self.pushButton_j3_add.setText("") - self.pushButton_j4_add.setText("") - self.pushButton_j5_sub.setText("") - self.pushButton_j6_add.setText("") - self.pushButton_j6_sub.setText("") - self.pushButton_j4_sub.setText("") - self.pushButton_j5_add.setText("") - self.label_j1.setText("") - self.label_j2.setText("") - self.label_j3.setText("") - self.label_j4.setText("") - self.label_j5.setText("") - self.label_j6.setText("") - self.lineEdit_manual_adjust_accuracy.setText(QCoreApplication.translate("MainWindow", u"1", None)) - self.lineEdit_manual_adjust_accuracy.setPlaceholderText(QCoreApplication.translate("MainWindow", u"0.001-20", None)) - self.label_manual_adjust_accuracy.setText(QCoreApplication.translate("MainWindow", u"\u8c03\u6574\u95f4\u9694\uff1a", None)) - self.tabWidget_control.setTabText(self.tabWidget_control.indexOf(self.tab_5), QCoreApplication.translate("MainWindow", u"\u8c03\u8bd5\u754c\u9762", None)) - self.pushButton_sign_go.setText("") - self.label_sign_go.setText(QCoreApplication.translate("MainWindow", u"\u53d6\u6599\u4e2d...", None)) - self.label_sign_photo.setText(QCoreApplication.translate("MainWindow", u"\u62cd\u7167\u4e2d...", None)) - self.pushButton_sign_photo.setText("") - self.label_sign_feed.setText(QCoreApplication.translate("MainWindow", u"\u6295\u6599\u4e2d...", None)) - self.pushButton_sign_take.setText("") - self.label_sign_take.setText(QCoreApplication.translate("MainWindow", u"\u6293\u6599\u4e2d...", None)) - self.pushButton_sign_feed.setText("") - self.label_status_model.setText(QCoreApplication.translate("MainWindow", u"\u81ea\u52a8", None)) - self.label_5.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u6a21\u5f0f\uff1a", None)) - self.label_status_remoteCmdLen.setText(QCoreApplication.translate("MainWindow", u"0", None)) - self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u8fdc\u7a0b\u6307\u4ee4\u6570\u91cf\uff1a", None)) - self.pushButton_tableFeedSet_addRow.setText(QCoreApplication.translate("MainWindow", u"\u65b0\u589e\u7ebf", None)) - self.pushButton_tableFeedSet_deleRow.setText(QCoreApplication.translate("MainWindow", u"\u5220\u9664\u7ebf", None)) - self.pushButton_tableFeedSet_save.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58", None)) - self.label_3.setText(QCoreApplication.translate("MainWindow", u"X1:", None)) - self.label_7.setText(QCoreApplication.translate("MainWindow", u"Y1:", None)) - self.label_8.setText(QCoreApplication.translate("MainWindow", u"Z1:", None)) - self.label_9.setText(QCoreApplication.translate("MainWindow", u"Y2:", None)) - self.label_10.setText(QCoreApplication.translate("MainWindow", u"Z2:", None)) - self.label_11.setText(QCoreApplication.translate("MainWindow", u"X2:", None)) - self.label_12.setText(QCoreApplication.translate("MainWindow", u"Z3:", None)) - self.label_13.setText(QCoreApplication.translate("MainWindow", u"X3:", None)) - self.label_14.setText(QCoreApplication.translate("MainWindow", u"Y3:", None)) - self.pushButton_get_p1.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d1", None)) - self.pushButton_get_p2.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d2", None)) - self.pushButton_get_p3.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d3", None)) - self.pushButton_set_p3.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d3", None)) - self.pushButton_set_p1.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d1", None)) - self.pushButton_set_p2.setText(QCoreApplication.translate("MainWindow", u"\u8bb0\u5f55\u70b9\u4f4d2", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u6295\u6599", None)) - self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"PushButton", None)) - self.pushButton.setText(QCoreApplication.translate("MainWindow", u"PushButton", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"Tab 2", None)) - self.label_date.setText(QCoreApplication.translate("MainWindow", u"2024-08-01", None)) - self.label.setText(QCoreApplication.translate("MainWindow", u"\u8bbe\u5907\u72b6\u6001\u76d1\u63a7", None)) - self.label_connect_status.setText("") - self.label_6.setText(QCoreApplication.translate("MainWindow", u"\u901a\u4fe1\u72b6\u6001", None)) - # retranslateUi - diff --git a/untitled.ui b/untitled.ui deleted file mode 100644 index 7b6f7ed..0000000 --- a/untitled.ui +++ /dev/null @@ -1,2918 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 901 - 665 - - - - 自动化密胺生产 - - - background-color: rgb(12, 78, 139); - - - Qt::ToolButtonStyle::ToolButtonIconOnly - - - - - - 780 - 640 - 91 - 16 - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 08:00:00 - - - - - - 0 - 0 - 901 - 631 - - - - background-color:#E6ECF5; - - - 0 - - - - 投料 - - - - - 0 - 8 - 101 - 31 - - - - background-color: #F9FAFC; -font: 700 9pt "Microsoft YaHei UI"; - -border: 1px solid #dcdfe6; - - - - 监控投料 - - - - - - 110 - 8 - 101 - 31 - - - - background-color: #F9FAFC; -font: 700 9pt "Microsoft YaHei UI"; - -border: 1px solid #dcdfe6; - - - - 投料设置 - - - - - - 230 - 8 - 101 - 31 - - - - background-color: #F9FAFC; -font: 700 9pt "Microsoft YaHei UI"; - -border: 1px solid #dcdfe6; - - - - IO调试 - - - - - - -10 - 40 - 891 - 561 - - - - 0 - - - - - - 0 - -10 - 877 - 571 - - - - background-color: #E6ECF5; - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 10 - 10 - 861 - 561 - - - - background-color: rgb(255, 255, 255); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 10 - 10 - 481 - 251 - - - - -background-image: url(:/bg/Image/robot.png); -background-position:center; -background-repeat:no-repeat; - - - - - - true - - - - - - 520 - 150 - 271 - 41 - - - - /**QSlider -{ - background-color: #FFFFFF; - border-style: outset; - border-radius:5px; -} - -QSlider::groove:horizontal -{ - height: 10px; - background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4); - margin: 10px 0 -} - -QSlider::handle:horizontal -{ - background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green); - width: 10px; - height: 16px; - margin: -5px 3px -5px 6px; - border-radius:5px; - border: 3px solid #007900; -} -**/ -/*第一种风格*/ -/** - groove表示槽的部分 - handle表示滑块 - add-page表示未滑过的槽部分 - sub-page表示已滑过的槽部分 - 在辅助控制器后面可以设置状态,horizontal就是QSS生效的QSlider的状态 -**/ - -QSlider::groove:horizontal -{ - height:10px; - border-radius: 5px; - background-color:rgb(219,219,219); -} - - -QSlider::handle:horizontal -{ - background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green); - width: 5px; - height: 5px; - margin: -5px 3px -5px 6px; - border-radius:5px; - border: 3px solid #007900; -} - -QSlider::add-page:horizontal -{ - border-radius: 5px; - background-color: rgb(219,219,219); -} - -QSlider::sub-page:horizontal -{ - border-radius: 5px; - background-color: rgb(80,166,234); -} - - - - - - - - - Qt::Orientation::Horizontal - - - - - - 800 - 160 - 31 - 21 - - - - font: 9pt "楷体"; - - - 10 - - - - - - 520 - 10 - 271 - 41 - - - - QComboBox { - border-radius: 10px; - padding: 5px 5px 5px 5px; - background-color: #2c2c2c; - color: white; - border: 1px solid #474747; - min-width: 80px; -} - - -QComboBox::drop-down { - width: 0px; - border: none; - -} - -QComboBox::down-arrow { - image: none; -} - -QComboBox QAbstractItemView { - border-bottom-right-radius: 10px; - border-bottom-left-radius: 10px; - background-color: #D3D3D3; - border: 1px solid gray; - padding: 4px 4px 4px 4px; - outline: none; -} - - - 1号线 - - - - 1号线 - - - - - 新建线 - - - - - - - 510 - 60 - 291 - 91 - - - - background-color: rgb(255, 255, 255); - - - 0 - - - - - - 10 - 60 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 50 - - - - - - 10 - 20 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 10 - - - - - - 80 - 60 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 60 - - - - - - 150 - 20 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 30 - - - - - - 220 - 20 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 40 - - - - - - 220 - 60 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 自定义 - - - - - - 80 - 20 - 61 - 31 - - - - -*{background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - 20 - - - - - - 150 - 60 - 61 - 31 - - - - background-color: #F9FAFC; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; - - - - - - Qt::AlignmentFlag::AlignCenter - - - 0-100 - - - lineEdit_num - pushButton_num_free - pushButton_num5 - pushButton_num1 - pushButton_4 - pushButton_num3 - pushButton_num4 - pushButton_num2 - - - - - - 30 - 30 - 91 - 41 - - - - *{ -background-color: #499C54; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 补一袋 - - - - - - - - - 170 - 30 - 91 - 41 - - - - *{ -background-color: rgb(255, 0, 0); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 扣一袋 - - - - - - - - - - - 110 - 530 - 113 - 21 - - - - 10 - - - 输入整数,切勿超速 - - - - - - 10 - 530 - 81 - 16 - - - - 当前自动速度: - - - - - - 100 - 530 - 75 - 23 - - - - -*{background-color: #A2EF4D; -border: 1px solid #dcdfe6; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover { - background-color: lightgreen; - color: black; -}*:pressed { - background-color: red; - color: white; - } - - - PushButton - - - - - - 10 - 270 - 491 - 241 - - - - 1 - - - - 日志 - - - - - 0 - 0 - 491 - 211 - - - - *{ - background-color: #D3D3D3; -} - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> -p, li { white-space: pre-wrap; } -hr { height: 1px; border-width: 0; } -li.unchecked::marker { content: "\2610"; } -li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - - - - 报警 - - - - - 0 - 0 - 491 - 231 - - - - *{ - color: red; - - background-color: #D3D3D3; -} - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> -p, li { white-space: pre-wrap; } -hr { height: 1px; border-width: 0; } -li.unchecked::marker { content: "\2610"; } -li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - - - - - - 390 - 230 - 91 - 21 - - - - background-color: rgba(255, 255, 255, 0); -color: red; - - - 正在移动 - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 510 - 190 - 341 - 321 - - - - QTabBar::tab { - background: #C0C0C0; - padding: 10px; - border-radius: 15px; -} -QTabBar::tab:selected { - background-color: #FFFFFF; - border:2px solid #008000; - border-radius: 15px 15px 0 0; /* 圆角控制 */ -} - - - 0 - - - - 生产界面 - - - - - 0 - 0 - 331 - 281 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 10 - 10 - 91 - 31 - - - - *{ -background-color: #499C54; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 启动 - - - - - - - - - 110 - 10 - 91 - 31 - - - - *{ -background-color: #2196F3; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 暂停 - - - - - - - - - 210 - 10 - 91 - 31 - - - - *{ -background-color: #F44336; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 停止 - - - - - - - - - 10 - 50 - 91 - 31 - - - - *{ -background-color: #FFFFBF; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #FFF000; -} - - - - 复位 - - - - - - - - - 110 - 50 - 91 - 31 - - - - *{ -background-color: rgb(255, 0, 0); -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color: #ff6e00; -} - - - - - 急停 - - - - - - - - - 210 - 50 - 91 - 31 - - - - *{ -background-color: #1CB2B1; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} -*:pressed -{ -background-color:#1cb052; -} - - - - - 清除报警 - - - - - - - - - 84 - 120 - 101 - 51 - - - - * { - background: qradialgradient(cx: 0.5, cy: 0.1 -, radius: 0.8, fx:0.5 ,fy:0, - stop: 0 rgba(255,255,255, 255), - stop: 1 rgba(33, 150, 243, 255)); -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 10px; -} - - - - PushButton - - - - - - - 调试界面 - - - - - 0 - 0 - 331 - 281 - - - - background-color: rgb(85, 170, 255); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 65 - 50 - 171 - 22 - - - - Qt::Orientation::Horizontal - - - - - - 65 - 30 - 31 - 21 - - - - -10 - - - - - - 215 - 30 - 31 - 21 - - - - +10 - - - - - - 65 - 70 - 53 - 21 - - - - -150 - - - - - - 215 - 70 - 21 - 21 - - - - 150 - - - - - - 65 - 90 - 171 - 22 - - - - Qt::Orientation::Horizontal - - - - - - 65 - 110 - 53 - 21 - - - - -150 - - - - - - 215 - 110 - 21 - 21 - - - - 150 - - - - - - 65 - 130 - 171 - 22 - - - - Qt::Orientation::Horizontal - - - - - - 65 - 190 - 53 - 21 - - - - -150 - - - - - - 65 - 210 - 171 - 22 - - - - Qt::Orientation::Horizontal - - - - - - 215 - 190 - 21 - 21 - - - - 150 - - - - - - 65 - 230 - 53 - 21 - - - - -150 - - - - - - 65 - 250 - 171 - 22 - - - - Qt::Orientation::Horizontal - - - - - - 215 - 230 - 21 - 21 - - - - 150 - - - - - - 65 - 150 - 53 - 21 - - - - -150 - - - - - - 65 - 170 - 171 - 22 - - - - Qt::Orientation::Horizontal - - - - - - 215 - 150 - 21 - 21 - - - - 150 - - - - - - 15 - 50 - 21 - 21 - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J1 - - - - - - 15 - 90 - 21 - 21 - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J2 - - - - - - 15 - 130 - 21 - 21 - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J3 - - - - - - 15 - 170 - 21 - 21 - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J4 - - - - - - 15 - 210 - 21 - 21 - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J5 - - - - - - 15 - 250 - 21 - 21 - - - - font: 700 9pt "Microsoft YaHei UI"; - - - J6 - - - - - - 245 - 50 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(0, 255, 0); -} - - - - - - - - - - - - - 30 - 50 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - 30 - 90 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - 245 - 90 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - 30 - 130 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - 245 - 130 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - 245 - 170 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - 30 - 210 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - 245 - 250 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - 30 - 250 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - 30 - 170 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color: rgb(255, 0, 0); -} - - - - - - - - - - - - - 245 - 210 - 31 - 21 - - - - *{ -background-color: #E7EAEA; -border-radius: 10px; -font: 10pt "楷体"; -} -*:hover{ - background-color: rgb(85, 85, 255); -} -*:pressed{ - background-color:rgb(85, 85, 255); -} - - - - - - - - - - - - - 285 - 50 - 41 - 21 - - - - - - - 285 - 90 - 41 - 21 - - - - - - - 285 - 130 - 41 - 21 - - - - - - - 285 - 170 - 41 - 21 - - - - - - - 285 - 210 - 41 - 21 - - - - - - - 285 - 250 - 41 - 21 - - - - - - - 125 - 32 - 53 - 15 - - - - - - - - - - 125 - 70 - 53 - 15 - - - - - - - - - - 125 - 110 - 53 - 15 - - - - - - - - - - 125 - 150 - 53 - 15 - - - - - - - - - - 125 - 190 - 53 - 15 - - - - - - - - - - 125 - 230 - 53 - 15 - - - - - - - - - - 110 - 10 - 61 - 21 - - - - 1 - - - 0.001-20 - - - - - - 50 - 13 - 53 - 15 - - - - 调整间隔: - - - - - - - - - 10 - 10 - 121 - 121 - - - - background-color: rgba(255, 255, 255, 0); - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 10 - 20 - 10 - 10 - - - - *{ -background-color: #7A7A7A; -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:pressed -{ -background-color: #ff6e00; -} - - - - - - - - - - - 30 - 15 - 71 - 20 - - - - background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color:#7A7A7A; - - - 取料中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - 30 - 39 - 61 - 20 - - - - background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color: red; - - - 拍照中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - 10 - 44 - 10 - 10 - - - - *{ -background-color: rgb(255, 0, 0); -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:pressed -{ -background-color: #ff6e00; -} - - - - - - - - - - - 30 - 89 - 61 - 20 - - - - background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color: black; - - - 投料中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - 10 - 70 - 10 - 10 - - - - *{ -background-color: rgb(255, 0, 0); -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:pressed -{ -background-color: #ff6e00; -} - - - - - - - - - - - 30 - 65 - 61 - 20 - - - - background-color: rgba(255, 255, 255, 0); -font: 700 12pt "Microsoft YaHei UI"; -color: black; - - - 抓料中... - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - 10 - 94 - 10 - 10 - - - - *{ -background-color: rgb(255, 0, 0); -font: 9pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 5px; -} -*:pressed -{ -background-color: #ff6e00; -} - - - - - - - - - - - - 320 - 530 - 81 - 21 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 自动 - - - - - - 240 - 530 - 81 - 16 - - - - 当前模式: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 550 - 530 - 81 - 21 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: #black; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - 0 - - - - - - 430 - 532 - 111 - 16 - - - - 当前远程指令数量: - - - - - - - - - - 10 - 50 - 871 - 191 - - - - - - - 710 - 10 - 75 - 31 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 新增线 - - - - - - 790 - 10 - 75 - 31 - - - - *{ -color: #ffffff; -background-color: #FF5722; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #499c8a; -} - - - - 删除线 - - - - - - 630 - 10 - 75 - 31 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 保存 - - - - - - 10 - 240 - 871 - 211 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 0 - 10 - 871 - 131 - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 20 - 20 - 53 - 15 - - - - X1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 80 - 20 - 91 - 21 - - - - true - - - - - - 290 - 20 - 91 - 21 - - - - true - - - - - - 230 - 20 - 53 - 15 - - - - Y1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 480 - 20 - 91 - 21 - - - - true - - - - - - 420 - 20 - 53 - 15 - - - - Z1: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 290 - 50 - 91 - 21 - - - - true - - - - - - 80 - 50 - 91 - 21 - - - - true - - - - - - 230 - 50 - 53 - 15 - - - - Y2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 420 - 50 - 53 - 15 - - - - Z2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 20 - 50 - 53 - 15 - - - - X2: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 480 - 50 - 91 - 21 - - - - true - - - - - - 480 - 80 - 91 - 21 - - - - true - - - - - - 80 - 80 - 91 - 21 - - - - true - - - - - - 420 - 80 - 53 - 15 - - - - Z3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 290 - 80 - 91 - 21 - - - - true - - - - - - 20 - 80 - 53 - 15 - - - - X3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 230 - 80 - 53 - 15 - - - - Y3: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - 594 - 20 - 81 - 23 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位1 - - - - - - 594 - 50 - 81 - 23 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位2 - - - - - - 594 - 80 - 81 - 23 - - - - -*{ -color: #ffffff; -background-color: rgb(16, 133, 255); -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位3 - - - - - - 680 - 80 - 81 - 23 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位3 - - - - - - 680 - 20 - 81 - 23 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位1 - - - - - - 680 - 50 - 81 - 23 - - - - -*{ -color: #ffffff; -background-color: #1AA094; -font: 12pt "楷体"; -border: 1px solid #dcdfe6; -border-radius: 6px; -} -*:pressed -{ -background-color: #197971; -} - - - - 记录点位2 - - - - - - - - - - Tab 2 - - - - - 10 - 10 - 75 - 23 - - - - PushButton - - - - - - 10 - 39 - 75 - 23 - - - - PushButton - - - - - - - - 690 - 640 - 91 - 16 - - - - color:#fff; -font: 290 9pt "Microsoft YaHei"; -font: 700 9pt "Microsoft YaHei UI"; - - - 2024-08-01 - - - Qt::AlignmentFlag::AlignCenter - - - - - - 300 - 634 - 301 - 28 - - - - background-color: #9A9A9A; - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - 20 - 7 - 81 - 16 - - - - color: #F9FFF9; -font: 700 9pt "等线"; - - - 设备状态监控 - - - - - - 220 - 7 - 16 - 16 - - - - QLabel { - background-color: #A2EF4D; /* 设置背景颜色 */ - color: #ffffff; /* 设置字体颜色 */ - border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */ - border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */ - qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */ -} - - - - - - - - - - 160 - 7 - 51 - 16 - - - - color: #F9FFF9; -font: 700 9pt "等线"; - - - 通信状态 - - - - tabWidget - label_time - label_date - frame - - - - - - - diff --git a/workflow_test.py b/workflow_test.py deleted file mode 100644 index 33403f2..0000000 --- a/workflow_test.py +++ /dev/null @@ -1,353 +0,0 @@ -import time -import threading -from enum import IntEnum - -# --- 1. 简化模拟必要的 Enum 和类 --- - -class FeedStatus(IntEnum): - FNone = 0 - FStart = 1 - FCheck = 2 - FMid = 3 - FPhoto = 4 - FTake = 5 - FDropBag = 9 # 简化,只保留关键状态 - -class CatchStatus: - CNone = 0 - CTake = 1 - COk = 2 - CDrop = 3 - -class Real_Position: - """简化的位置表示""" - def __init__(self, name=""): - self.name = name - - def compare(self, other, is_action=False): - # 简化比较,只比较名字 - return self.name == other.name - - def __str__(self): - return self.name - -class PositionModel: - """简化的位置模型""" - def __init__(self, status, position): - self.status = status - self.position = position - - def get_position(self): - return self.position - -class FeedLine: - """简化 FeedLine,只包含关键点""" - def __init__(self, name, positions: list): # positions: list of PositionModel - self.name = name - # 假设 positions 按顺序排列,且包含 FTake 和 FDropBag 点 - self.positions = positions - self.take_position_model = None - self.drop_position_model = None - self._find_key_positions() - - def _find_key_positions(self): - for pm in self.positions: - if pm.status == FeedStatus.FTake: - self.take_position_model = pm - elif pm.status == FeedStatus.FDropBag: - self.drop_position_model = pm - - def get_take_position(self): - return self.take_position_model - -# --- 2. 简化模拟 Catch 模块 --- -class SimulatedCatch: - def __init__(self, log_func): - self.catch_status = CatchStatus.CNone - self.log_signal = log_func # 用于打印日志的函数 - - def run(self): - """模拟抓取动作""" - if self.catch_status == CatchStatus.CTake: - self.log_signal(logging.INFO, "🤖 Sim Catch: 开始执行抓取动作...") - time.sleep(1) # 模拟抓取耗时 - self.catch_status = CatchStatus.COk - self.log_signal(logging.INFO, "🎉 Sim Catch: 抓取完成!") - elif self.catch_status == CatchStatus.CDrop: - self.log_signal(logging.INFO, "📦 Sim Catch: 开始执行投料动作...") - time.sleep(0.5) # 模拟投料耗时 - self.catch_status = CatchStatus.COk - self.log_signal(logging.INFO, "🎊 Sim Catch: 投料完成!") - -# --- 3. 简化 FeedingConfig --- -class FeedingConfig: - def __init__(self, num: int, feedLine: FeedLine, drop_positions: list): - self.num = num - self.feedLine = feedLine - self.drop_positions = drop_positions # list of Real_Position - -# --- 4. 简化 RobotClient 状态 --- -class SimulatedRobotClient: - def __init__(self, initial_position_name): - self.status_model = type('obj', (object,), {'world_0': 0, 'world_1': 0, 'world_2': 0, 'world_3': 0, 'world_4': 0, 'world_5': 0})() - self.origin_position = Real_Position("Origin") - self.feed_speed = 10 - # 当前模拟位置 - self.current_position = Real_Position(initial_position_name) - - def getRealPosition(self): - return self.current_position - -# --- 5. 模拟传感器 --- -class SimulatedSensor: - def __init__(self, name, initial_state=False): - self.name = name - self.state = initial_state - self.thread = None - self._running = False - - def start_simulation(self, sequence): - """根据一个序列 (时间, 状态) 来模拟传感器状态变化""" - self._running = True - def _run(): - start_time = time.time() - seq_index = 0 - while self._running and seq_index < len(sequence): - elapsed = time.time() - start_time - if elapsed >= sequence[seq_index][0]: # sequence[seq_index][0] 是触发时间 - self.state = sequence[seq_index][1] # sequence[seq_index][1] 是触发状态 - print(f" 📡 [{self.name}] 模拟状态变为: {self.state}") - seq_index += 1 - time.sleep(0.1) # 检查间隔 - self.thread = threading.Thread(target=_run, daemon=True) - self.thread.start() - - def stop_simulation(self): - self._running = False - if self.thread: - self.thread.join() - -# --- 6. 简化版 Feeding 类 (核心逻辑) --- -import logging - -class SimulatedFeeding: - def __init__(self, robotClient: SimulatedRobotClient, sensor2: SimulatedSensor): - self.feedConfig = None - self.feedStatus = FeedStatus.FNone - self.robotClient = robotClient - self.sensor2 = sensor2 # 使用模拟传感器 - self.pause = False - self.is_reverse = False - self.catch = SimulatedCatch(self._simple_log) # 使用模拟 Catch - # --- 码垛模式新增 --- - self.current_drop_index = 0 - - # 简化的日志信号 - # self.log_signal = self._simple_log - self.log_signal = lambda level, message: self._simple_log(level, message) - - - def _simple_log(self, level, message): - level_str = {logging.INFO: "INFO", logging.ERROR: "ERROR", logging.WARNING: "WARN"}.get(level, "LOG") - print(f"[{level_str}] {message}") - - def set_config(self, config: FeedingConfig): - self.feedConfig = config - - def start(self): - if self.feedConfig: - self.feedStatus = FeedStatus.FStart - self.log_signal(logging.INFO, "🚀 启动仿真投料流程") - # self.log_signal(logging.INFO, "🚀 启动仿真投料流程") - - def run(self): - """仿真运行一次主循环""" - if self.feedConfig is None or self.feedStatus == FeedStatus.FNone or self.pause: - return - - # 获取当前模拟位置 - real_position = self.robotClient.current_position - - # --- 简化版 FStart --- - if self.feedStatus == FeedStatus.FStart: - # self.log_signal(logging.INFO, "🟢 FStart: 初始化流程") - self.log_signal(logging.INFO, "🟢 FStart: 初始化流程") - self.current_drop_index = 0 # 重置投料点索引 - # 模拟移动到抓取点 (直接设置位置) - take_pos_model = self.feedConfig.feedLine.get_take_position() - if take_pos_model: - self.robotClient.current_position = take_pos_model.get_position() - self.log_signal(logging.INFO, f"🚚 FStart: 移动到抓取点 {self.robotClient.current_position}") - # self.log_signal(logging.INFO, f"🚚 FStart: 移动到抓取点 {self.robotClient.current_position}") - self.feedStatus = FeedStatus.FTake - else: - # self.log_signal(logging.ERROR, "❌ FStart: 未找到抓取点!") - self.log_signal(logging.ERROR, "❌ FStart: 未找到抓取点!") - self.feedStatus = FeedStatus.FNone - return # 等待下次循环 - - # --- 简化版 FTake --- - elif self.feedStatus == FeedStatus.FTake: - # self.log_signal(logging.INFO, "✋ FTake: 检查是否到达抓取点并等待传感器信号") - self.log_signal(logging.INFO, "✋ FTake: 检查是否到达抓取点并等待传感器信号") - take_position_model = self.feedConfig.feedLine.get_take_position() - if not take_position_model or not take_position_model.get_position(): - self.log_signal(logging.ERROR, "❌ FTake: 抓取点配置错误!") - # self.log_signal(logging.ERROR, "❌ FTake: 抓取点配置错误!") - self.feedStatus = FeedStatus.FNone - return - - if not take_position_model.get_position().compare(real_position): - self.log_signal(logging.WARNING, f"⚠️ FTake: 机器人未在抓取点 ({take_position_model.get_position()}), 当前在 {real_position}") - # self.log_signal(logging.WARNING, f"⚠️ FTake: 机器人未在抓取点 ({take_position_model.get_position()}), 当前在 {real_position}") - # 在仿真中,我们假设它会移动到位,所以直接设置 - self.robotClient.current_position = take_position_model.get_position() - self.log_signal(logging.INFO, f"🔧 强制移动到抓取点 {self.robotClient.current_position}") - # self.log_signal(logging.INFO, f"🔧 强制移动到抓取点 {self.robotClient.current_position}") - - # 模拟等待传感器2信号 - # 在实际仿真中,我们可以通过预设序列或用户输入来控制 - # 这里用一个简单的循环等待 (实际应用中应避免阻塞) - wait_start = time.time() - timeout = 10 # 10秒超时 - while not self.sensor2.state: - if time.time() - wait_start > timeout: - # self.log_signal(logging.ERROR, "⏰ FTake: 等待传感器2超时!") - self.log_signal(logging.ERROR, "⏰ FTake: 等待传感器2超时!") - self.feedStatus = FeedStatus.FNone - return - self.log_signal(logging.INFO, "⏳ FTake: 等待传感器2信号...") - time.sleep(1) # 每秒检查一次 - - self.log_signal(logging.INFO, "✅ FTake: 传感器2信号收到,开始抓取") - # 执行抓取动作 - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CTake - return # 等待下一周期 Catch 完成 - if self.catch.catch_status == CatchStatus.CTake: - return # 等待 Catch 模块处理 - if self.catch.catch_status == CatchStatus.COk: - self.catch.catch_status = CatchStatus.CNone - self.log_signal(logging.INFO, "👏 FTake: 抓取成功,准备投料") - # 移动到第一个投料点 - if self.feedConfig.drop_positions: - target_drop_pos = self.feedConfig.drop_positions[self.current_drop_index] - self.robotClient.current_position = target_drop_pos - self.log_signal(logging.INFO, f"🚚 FTake: 移动到投料点 {self.current_drop_index} ({target_drop_pos})") - self.feedStatus = FeedStatus.FDropBag - else: - self.log_signal(logging.ERROR, "❌ FTake: 投料点列表为空!") - self.feedStatus = FeedStatus.FNone - return - - # --- 简化版 FDropBag (码垛核心) --- - elif self.feedStatus == FeedStatus.FDropBag: - if not self.feedConfig.drop_positions: - self.log_signal(logging.ERROR, "❌ FDropBag: 投料点列表为空!") - self.feedStatus = FeedStatus.FNone - return - - target_drop_position = self.feedConfig.drop_positions[self.current_drop_index] - self.log_signal(logging.INFO, f"📦 FDropBag: 当前目标投料点索引: {self.current_drop_index} ({target_drop_position})") - - # 检查是否到达目标投料点 (仿真中直接比较) - if target_drop_position.compare(real_position): - self.log_signal(logging.INFO, f"🎯 FDropBag: 到达投料点 {self.current_drop_index}") - - # 执行投料动作 - if self.catch.catch_status == CatchStatus.CNone: - self.catch.catch_status = CatchStatus.CDrop - self.log_signal(logging.INFO, "🪂 FDropBag: 开始执行投料动作...") - return # 等待下一周期检查 COk - if self.catch.catch_status == CatchStatus.CDrop: - self.log_signal(logging.INFO, "🪂 FDropBag: 投料动作进行中...") - return # 等待 Catch 模块完成 - if self.catch.catch_status == CatchStatus.COk: - self.catch.catch_status = CatchStatus.CNone - self.log_signal(logging.INFO, f"🎉 FDropBag: 在投料点 {self.current_drop_index} 投料完成") - - # 更新投料计数 - self.feedConfig.num -= 1 - self.log_signal(logging.INFO, f'🔢 剩余投料次数: {self.feedConfig.num}') - - # 检查是否所有投料任务完成 - if self.feedConfig.num > 0: - # 更新投料点索引 (循环) - self.current_drop_index = (self.current_drop_index + 1) % len(self.feedConfig.drop_positions) - self.log_signal(logging.INFO, f"🔄 更新投料点索引为: {self.current_drop_index}") - - # 移动到固定的抓取点 (仿真中直接设置位置) - take_position_model = self.feedConfig.feedLine.get_take_position() - if take_position_model: - self.log_signal(logging.INFO, f"🔄 移动到固定抓取点...") - self.robotClient.current_position = take_position_model.get_position() - self.log_signal(logging.INFO, f"📍 已移动到抓取点 {self.robotClient.current_position}") - self.feedStatus = FeedStatus.FTake # 设置状态为 FTake - else: - self.log_signal(logging.ERROR, "❌ 无法获取抓取点位置!") - self.feedStatus = FeedStatus.FNone - - else: - # 所有投料完成 - self.log_signal(logging.INFO, "🎊 所有投料任务完成") - self.feedStatus = FeedStatus.FNone # 结束流程 - - else: - # 如果还没到达目标投料点 (仿真中直接移动) - self.log_signal(logging.INFO, f"🚚 正在移动到投料点 {self.current_drop_index} ({target_drop_position})") - self.robotClient.current_position = target_drop_position - self.log_signal(logging.INFO, f"📍 已移动到投料点 {self.current_drop_index} ({self.robotClient.current_position})") - -# --- 7. 主程序入口 --- -if __name__ == "__main__": - # --- 配置仿真环境 --- - logging.basicConfig(level=logging.INFO) # 设置日志级别 - - # 1. 定义位置点 - origin_pos = Real_Position("Origin") - take_pos = Real_Position("Fixed_Take_Point") - drop_pos_1 = Real_Position("Drop_Point_1") - drop_pos_2 = Real_Position("Drop_Point_2") - drop_pos_3 = Real_Position("Drop_Point_3") - - # 2. 创建 FeedLine (简化) - feedline_positions = [ - PositionModel(FeedStatus.FTake, take_pos), - PositionModel(FeedStatus.FDropBag, Real_Position("Placeholder_Drop_Pos")) # 占位,实际由 drop_positions 列表决定 - ] - feed_line = FeedLine("SimFeedLine", feedline_positions) - - # 3. 定义投料点列表 (码垛点) - drop_points = [drop_pos_1, drop_pos_2, drop_pos_3] - - # 4. 创建 FeedingConfig - total_bags = 5 # 总共要投的料包数 - feeding_config = FeedingConfig(num=total_bags, feedLine=feed_line, drop_positions=drop_points) - - # 5. 创建模拟机器人和传感器 - robot_client = SimulatedRobotClient("Origin") - sensor2 = SimulatedSensor("Sensor2", initial_state=False) # 初始无信号 - - # 6. 创建并配置仿真 Feeding - sim_feeding = SimulatedFeeding(robot_client, sensor2) - sim_feeding.set_config(feeding_config) - - # 7. (可选) 预设传感器2信号序列 [(时间(秒), 状态), ...] - # 例如:在第2秒时变为True,第8秒时变为False,第15秒时再变为True... - sensor2_sequence = [(2, True), (8, False), (15, True), (22, False), (30, True)] - sensor2.start_simulation(sensor2_sequence) - - # 8. 启动流程 - sim_feeding.start() - - # 9. 运行仿真主循环 - try: - while sim_feeding.feedStatus != FeedStatus.FNone: - sim_feeding.run() - sim_feeding.catch.run() # 触发模拟抓取/投料逻辑 - time.sleep(0.5) # 控制仿真循环速度 - except KeyboardInterrupt: - print("\n🛑 仿真被用户中断") - finally: - sensor2.stop_simulation() - print("🏁 仿真结束")

ey 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 0: - for feed_line_key, feed_line in self.feedLine_dict.items(): - if feed_line_key == self.tableWidget_feedSeting.item(selectRow, 0).text(): - self.feedLine_dict.pop(feed_line_key) - self.tableWidget_feedSeting.removeRow(selectRow) - break - else: - QMessageBox.information(self, "提示", "请选择要删除的行") - - def send_tabelFeedSet_save(self): - count = len(self.feedLine_dict.keys()) - self.configReader.read(Constant.set_ini) - self.configReader.set('Robot_Feed', 'LineCount', str(count)) - writeFeedLine_to_ini(self.feedLine_dict, Constant.feedLine_set_file) - pass - - def send_stopFeed_button_click(self): - # 清空状态 - self.feeding.feedStatus = FeedStatus.FNone - # 清空运行命令 - self.send_clear_auto_command() - log.log_message(logging.INFO, Constant.str_feed_stop) - - def send_pauseFeed_button_click(self): - if self.pushButton_pauseFeed.text() == '暂停': - self.pushButton_pauseFeed.setText('继续') - log.log_message(logging.INFO, Constant.str_feed_pause) - self.send_pause_command(True) - self.feeding.pause = True - else: - self.pushButton_pauseFeed.setText('暂停') - self.send_pause_command(False) - log.log_message(logging.INFO, Constant.str_feed_continue) - self.send_start_tool_command() - log.log_message(logging.INFO, Constant.str_sys_start_tool) - self.feeding.pause = False - - pass - def send_tabWidget_control_change(self): - if self.robotClient.status_model.curMode != 7: - self.send_switch_tool_command() - log.log_message(logging.INFO, Constant.str_sys_switch_tool) - self.send_start_tool_command() - - def send_reset_button_click(self): - line_head = self.comboBox_lineIndex.currentData() - safe_position = self.feedLine_dict[line_head].safe_position - self.send_position_command(safe_position.X, safe_position.Y, safe_position.Z, safe_position.U, safe_position.V, safe_position.W,move_type=MoveType.WORLD) - - def send_tabelFeedSet_itemChanged(self, item): - row = item.row() - column = item.column() - value = item.text() - head = self.tableWidget_feedSeting.item(row, 0).text() - if column == 1: - self.feedLine_dict[head].name = value - elif column == (0 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.X = float(value) - elif column == (1 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.Y = float(value) - elif column == (2 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.Z = float(value) - elif column == (3 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.U = float(value) - elif column == (4 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.V = float(value) - elif column == (5 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].safe_position.W = float(value) - # elif column == 7: - elif column == (6 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].photo_position.X = float(value) - elif column == (7 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].photo_position.Y = float(value) - elif column == (8 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].photo_position.Z = float(value) - elif column == (9 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].photo_position.U = float(value) - elif column == (10 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].photo_position.V = float(value) - elif column == (11 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].photo_position.W = float(value) - - elif column == (12 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].feed_position.X = float(value) - elif column == (13 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].feed_position.Y = float(value) - elif column == (14 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].feed_position.Z = float(value) - elif column == (15 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].feed_position.U = float(value) - elif column == (16 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].feed_position.V = float(value) - elif column == (17 + self.tableWidget_feedSeting_addtional_col_num): - self.feedLine_dict[head].feed_position.W = float(value) - - def run(self): - while True: - time.sleep(0.1) - if not self.command_quene.empty(): - command = self.command_quene.get() - if isinstance(command, FeedCommand) and command.status == Status.Prepareing: - if self.feeding.feedStatus == FeedStatus.FNone: - self.feeding.feedConfig = command.feed_config - self.feeding.feedStatus = FeedStatus.FStart - command.status = Status.Runing - - try: - self.feeding.run() - except: - print(Error_Code.SYS_NONEPoint) - self.updateUI() - - # pass #主线程 - - def updateUI(self): - if self.robotClient.connected: - self.set_label_status_style(True) - else: - self.set_label_status_style(False) - if self.feeding.feedStatus != FeedStatus.FNone: - self.horizontalSlider_feedingNum.setValue( - self.horizontalSlider_feedingNum.maximum() - self.feeding.feedConfig.num) - else: - self.set_run_status_button(False) - if self.feeding.feedStatus == FeedStatus.FNone: - self.stackedWidget_num.setCurrentIndex(0) - else: - self.stackedWidget_num.setCurrentIndex(1) - - # if self.feeding.feedConfig.num==2: - # self.feeding.pause=True - # self.send_pause_command(True) - # self.show_messagebox_of_person() - # log.log_message(logging.ERROR, '人员进入安全区') - self.label_date.setText(datetime.now().strftime("%Y-%m-%d")) - self.label_time.setText(datetime.now().strftime("%H:%M:%S")) - - self.updateUI_Position() - self.updateUI_label_detection() - self.updateUI_label_status() - self.updateUI_frame_sign(self.feeding.feedStatus) - - def updateUI_label_detection(self): - backgroud_img = Util.util_pic.cv2_to_qpixmap(self.feeding.detection_image) - self.label_showDetection.setPixmap(backgroud_img) - - def updateUI_Select_Line(self): - self.comboBox_lineIndex.clear() - for key, value in self.feedLine_dict.items(): - self.comboBox_lineIndex.addItem(value.name, key) - def updateUI_label_status(self): - if self.robotClient.status_model.isMoving==1: - self.label_move_sign.show() - if self.label_move_sign.text() == '正在移动.': - self.label_move_sign.setText('正在移动..') - else: - self.label_move_sign.setText('正在移动.') - else: - self.label_move_sign.hide() - if self.robotClient.status_model.curMode >= 0: - try: - self.label_status_model.setText(Constant.mode_array[self.robotClient.status_model.curMode]) - except: - self.label_status_model.setText('未知模式') - self.label_status_remoteCmdLen.setText(str(self.robotClient.status_model.RemoteCmdLen)) - - - def updateUI_Position(self): - self.horizontalSlider_J1.setValue(self.status_address.axis_0) - self.horizontalSlider_J2.setValue(self.status_address.axis_1) - self.horizontalSlider_J3.setValue(self.status_address.axis_2) - self.horizontalSlider_J4.setValue(self.status_address.axis_3) - self.horizontalSlider_J5.setValue(self.status_address.axis_4) - self.horizontalSlider_J6.setValue(self.status_address.axis_5) - - self.label_j1.setText(str(self.status_address.axis_0)) - self.label_j2.setText(str(self.status_address.axis_1)) - self.label_j3.setText(str(self.status_address.axis_2)) - self.label_j4.setText(str(self.status_address.axis_3)) - self.label_j5.setText(str(self.status_address.axis_4)) - self.label_j6.setText(str(self.status_address.axis_5)) - - def set_position_to_tabel(self, row_i, position_j, real_Position: Real_Position): - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.X))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 1 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.Y))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 2 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.Z))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 3 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.U))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 4 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.V))) - self.tableWidget_feedSeting.setItem(row_i, position_j * 6 + 5 + self.tableWidget_feedSeting_addtional_col_num, - QTableWidgetItem(str(real_Position.W))) - def updateUI_frame_sign(self,sign:FeedStatus): - # print("start") - if sign == FeedStatus.FNone: - self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) - self.set_sign_status(self.label_sign_photo, self.pushButton_sign_photo, False) - self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) - self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) - return - if sign < FeedStatus.FPhoto: - self.set_sign_status(self.label_sign_go,self.pushButton_sign_go,True) - self.set_sign_status(self.label_sign_photo, self.pushButton_sign_photo, False) - self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) - self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) - return - if sign <= FeedStatus.FPhoto: - self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) - self.set_sign_status(self.label_sign_photo,self.pushButton_sign_photo,True) - self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) - self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) - return - if sign <= FeedStatus.FTake: - self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) - self.set_sign_status(self.label_sign_photo, self.pushButton_sign_photo, False) - self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, True) - self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, False) - return - if sign <= FeedStatus.FBroken: - self.set_sign_status(self.label_sign_go, self.pushButton_sign_go, False) - self.set_sign_status(self.label_sign_photo, self.pushButton_sign_photo, False) - self.set_sign_status(self.label_sign_take, self.pushButton_sign_take, False) - self.set_sign_status(self.label_sign_feed, self.pushButton_sign_feed, True) - return - pass - - - def set_label_status_style(self, connected: bool): - - if connected: - if self.label_connect_status.styleSheet().strip() != self.active_status_Qss: - self.label_connect_status.setStyleSheet(self.active_status_Qss) - self.active_status_Qss = self.label_connect_status.styleSheet().strip() - - else: - if self.label_connect_status.styleSheet().strip() != self.noActive_status_Qss: - self.label_connect_status.setStyleSheet(self.noActive_status_Qss) - self.noActive_status_Qss = self.label_connect_status.styleSheet().strip() - def set_sign_status(self,label,btn,signed:bool): - - try : - if signed: - if label.styleSheet().strip() != self.active_label_sign_Qss: - label.setStyleSheet(self.active_label_sign_Qss) - self.active_label_sign_Qss = label.styleSheet().strip() - - if btn.styleSheet().strip() != self.active_btn_sign_Qss: - btn.setStyleSheet(self.active_btn_sign_Qss) - self.active_btn_sign_Qss = btn.styleSheet().strip() - else: - if label.styleSheet().strip() != self.noactive_label_sign_Qss: - label.setStyleSheet(self.noactive_label_sign_Qss) - self.noactive_label_sign_Qss = label.styleSheet().strip() - if btn.styleSheet().strip() != self.noactive_btn_sign_Qss: - btn.setStyleSheet(self.noactive_btn_sign_Qss) - self.noactive_btn_sign_Qss = btn.styleSheet().strip() - except Exception as e: - print(e) - - - - def set_run_status_button(self, isRuning: bool): - self.pushButton_pauseFeed.setText("暂停") - if isRuning: - self.pushButton_pauseFeed.show() - self.pushButton_stopFeed.show() - self.pushButton_startFeed.hide() - else: - self.pushButton_pauseFeed.hide() - self.pushButton_stopFeed.hide() - self.pushButton_startFeed.show() - - def send_clear_auto_command(self): - clear_command = CMDInstructRequest() - request_command = clear_command.toString() - log.log_message(logging.INFO, Constant.str_sys_clearAlarm) - self.command_quene.put(request_command) - - def send_position_command(self, x1, x2, x3, x4, x5, x6, move_type: MoveType = MoveType.WORLD): - - position_instruction = Instruction() - position_instruction.m0 = float(x1) - position_instruction.m1 = float(x2) - position_instruction.m2 = float(x3) - position_instruction.m3 = float(x4) - position_instruction.m4 = float(x5) - position_instruction.m5 = float(x6) - position_instruction.action = move_type.value - instruction_command = CMDInstructRequest() - instruction_command.instructions.append(position_instruction) - request_command = instruction_command.toString() - log_str = f'移动到位置:{"自由路径" if move_type == MoveType.AXIS else "姿势直线"}:' \ - f'm0:{position_instruction.m0}-' \ - f'm2:{position_instruction.m1}-' \ - f'm3:{position_instruction.m2}-' \ - f'm4:{position_instruction.m3}-' \ - f'm5:{position_instruction.m4}-' \ - f'm6:{position_instruction.m5}' - log.log_message(logging.INFO,log_str) - self.robotClient.add_sendQuene(request_command) - - def send_pause_command(self, pause: bool): - pause_command = CMDRequest() - pause_command.cmdData.append("actionPause") - if pause: - pause_command.cmdData.append("1") - else: - pause_command.cmdData.append("0") - request_command = pause_command.toString() - self.robotClient.add_sendQuene(request_command) - - def send_clear_alarm_command(self, pause: bool): - pause_command = CMDRequest() - pause_command.cmdData.append("clearAlarmContinue") - pause_command.cmdData.append("1") - request_command = pause_command.toString() - log_str = f'暂停:{pause}' - self.robotClient.add_sendQuene(request_command) - - def send_switch_tool_command(self): - switch_command = CMDRequest() - switch_command.cmdData.append("switchTool") - switch_command.cmdData.append("2") - request_command = switch_command.toString() - - self.robotClient.add_sendQuene(request_command) - - def send_start_tool_command(self): - switch_command = CMDRequest() - switch_command.cmdData.append("startButton") - switch_command.cmdData.append("1") - request_command = switch_command.toString() - print(request_command) - - self.robotClient.add_sendQuene(request_command) - - def show_messagebox_of_person(self): - - msg_box = QMessageBox(self) - msg_box.setWindowTitle("提示") - msg_box.setText("当前有人是否继续") - msg_box.setIcon(QMessageBox.Question) - msg_box.setStandardButtons(QMessageBox.Yes) - msg_box.setDefaultButton(QMessageBox.Yes) - - - result = msg_box.exec() - - - - if result == QMessageBox.Yes: - self.feeding.pause = False - self.send_pause_command(False) - - ### 设置界面 - def get_p1_button_click(self): - realPosition = self.robotClient.status_model.getRealPosition() - self.lineEdit_x1.setText(realPosition.X) - self.lineEdit_y1.setText(realPosition.Y) - self.lineEdit_z1.setText(realPosition.Z) - - def get_p2_button_click(self): - realPosition = self.robotClient.status_model.getRealPosition() - self.lineEdit_x2.setText(realPosition.X) - self.lineEdit_y2.setText(realPosition.Y) - self.lineEdit_z2.setText(realPosition.Z) - - def get_p3_button_click(self): - realPosition = self.robotClient.status_model.getRealPosition() - self.lineEdit_x3.setText(realPosition.X) - self.lineEdit_y3.setText(realPosition.Y) - self.lineEdit_z3.setText(realPosition.Z) - - def set_p1_button_click(self): - try: - x1 = float(self.lineEdit_x1.text()) - y1 = float(self.lineEdit_y1.text()) - z1 = float(self.lineEdit_z1.text()) - self.robotClient.photo_locs[0] = (x1, y1, z1) - self.configReader.read(Constant.set_ini) - self.configReader.set('Robot_Feed', 'photo_x1', str(x1)) - self.configReader.set('Robot_Feed', 'photo_y1', str(y1)) - self.configReader.set('Robot_Feed', 'photo_z1', str(z1)) - log.log_message(logging.INFO, f'设置拍照点1:{x1},{y1},{z1}') - except: - self.show_infomessage_box("设置拍照点1失败") - - def set_p2_button_click(self): - try: - x2 = float(self.lineEdit_x2.text()) - y2 = float(self.lineEdit_y2.text()) - z2 = float(self.lineEdit_z2.text()) - self.robotClient.photo_locs[1] = (x2, y2, z2) - self.configReader.read(Constant.set_ini) - self.configReader.set('Robot_Feed', 'photo_x2', str(x2)) - self.configReader.set('Robot_Feed', 'photo_y2', str(y2)) - self.configReader.set('Robot_Feed', 'photo_z2', str(z2)) - log.log_message(logging.INFO, f'设置拍照点2:{x2},{y2},{z2}') - except: - self.show_infomessage_box("设置拍照点2失败") - - - def set_p3_button_click(self): - try: - x3 = float(self.lineEdit_x3.text()) - y3 = float(self.lineEdit_y3.text()) - z3 = float(self.lineEdit_z3.text()) - self.robotClient.photo_locs[2] = (x3, y3, z3) - self.configReader.read(Constant.set_ini) - self.configReader.set('Robot_Feed', 'photo_x3', str(x3)) - self.configReader.set('Robot_Feed', 'photo_y3', str(y3)) - self.configReader.set('Robot_Feed', 'photo_z3', str(z3)) - log.log_message(logging.INFO, f'设置拍照点3:{x3},{y3},{z3}') - except: - self.show_infomessage_box("设置拍照点3失败") - - - def updateUI_Photo_Set(self): - self.lineEdit_x1.setText(str(self.robotClient.photo_locs[0][0])) - self.lineEdit_y1.setText(str(self.robotClient.photo_locs[0][1])) - self.lineEdit_z1.setText(str(self.robotClient.photo_locs[0][2])) - self.lineEdit_x2.setText(str(self.robotClient.photo_locs[1][0])) - self.lineEdit_y2.setText(str(self.robotClient.photo_locs[1][1])) - self.lineEdit_z2.setText(str(self.robotClient.photo_locs[1][2])) - self.lineEdit_x3.setText(str(self.robotClient.photo_locs[2][0])) - self.lineEdit_y3.setText(str(self.robotClient.photo_locs[2][1])) - self.lineEdit_z3.setText(str(self.robotClient.photo_locs[2][2])) - pass - - def show_infomessage_box(self,message): - msg_box = QMessageBox(self) - msg_box.setWindowTitle("提示") - msg_box.setText(message) - msg_box.setIcon(QMessageBox.Information) - msg_box.setStandardButtons(QMessageBox.OK) - - -if __name__ == "__main__": - app = QApplication(sys.argv) - window = MainWindow() - window.show() - sys.exit(app.exec()) diff --git a/main.py b/main.py index 0414334..28051fa 100644 --- a/main.py +++ b/main.py @@ -48,6 +48,7 @@ from ui_MainWin import Ui_MainWindow from view.ResetView import StopDialog from EMV.EMV import RelayController from CU.drop import DropPositionManager +import re class MainWindow(QMainWindow, Ui_MainWindow): @@ -58,7 +59,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.setupUi(self) #传感器继电器加入变量 self.relay_controller = RelayController() - self.drop_position_manager = DropPositionManager() + self.drop_position_manager = DropPositionManager(Constant.dropLine_set_file) self.feed_reset_obj=None self.sensor_thread = None self.sensor2_thread = None @@ -248,7 +249,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): line_model.save_line_model(config_reader) config_reader.write(open(Constant.feedLine_set_file, 'w', encoding='utf-8')) elif section.startswith(Constant.dropLine_set_section): - self.drop_position_manager.save_path_points(line_model) + loc_dropline_file=Constant.dropLine_set_file + if section.endswith('-35'): + loc_dropline_file=Constant.dropLine_set_file_35 + DropPositionManager(loc_dropline_file).save_path_points(line_model) self.init_FeedLine() break self.init_table_lines_data() @@ -414,7 +418,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.tableWidget_line_positions.removeRow(self.tableWidget_line_positions.currentRow()) if self.selected_line_section.startswith(Constant.dropLine_set_section): - self.drop_position_manager.del_drop_point(section) + loc_dropline_file=Constant.dropLine_set_file + if self.selected_line_section.endswith('-35'): + loc_dropline_file=Constant.dropLine_set_file_35 + DropPositionManager(loc_dropline_file).del_drop_point(section) else: config_writer = configparser.ConfigParser() config_writer.read(Constant.feedLine_set_file, encoding = 'utf-8') @@ -603,6 +610,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): } """) self.label_showDetection.setScaledContents(True) + self.comboBox_dropWeight.wheelEvent=lambda e:None if self.label_showDetection.size().width() < 100 or self.label_showDetection.size().height() < 100: self.label_showDetection.setMinimumSize(541, 321) @@ -767,14 +775,15 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.last_time = time.time() self.remain_lineName = self.configReader.get('Robot_Feed', 'remain_lineName') + self.remain_drop_weight = self.configReader.get("Robot_Feed", "remain_dropweight_kg") # 9/29 投料重量, 单位kg self.remain_Count = int(self.configReader.get('Robot_Feed', 'remain_Count')) self.maduo_Count = int(self.configReader.get('Robot_Feed', 'maduo_Count')) self.label_remain_num.setText(str(self.remain_Count)) self.label_maxNum.setText(str(self.maduo_Count)) - _cur_sel_button=[button for button in self.frame_23.findChildren(QPushButton) if button.text()==str(self.maduo_Count)] - if _cur_sel_button: - _cur_sel_button[0].setStyleSheet(self.pushbutton_num_style_select) - self.cur_pushbutton_num = _cur_sel_button[0] + # _cur_sel_button=[button for button in self.frame_23.findChildren(QPushButton) if button.text()==str(self.maduo_Count)] + # if _cur_sel_button: + # _cur_sel_button[0].setStyleSheet(self.pushbutton_num_style_select) + # self.cur_pushbutton_num = _cur_sel_button[0] self.horizontalSlider_feedingNum.setMaximum(self.maduo_Count) self.updateUI_seting.connect(self.update_seting_frame) try: @@ -915,11 +924,21 @@ class MainWindow(QMainWindow, Ui_MainWindow): feed_line.read_line_model(config_reader=configReader,index=i) self.feedLine_dict[f'{Constant.feedLine_set_section}{i}'] = feed_line #加载所有码垛的路径信息 - for i in range(1,Constant.MAX_Line_num): - line_model = self.drop_position_manager.load_path_points(i) - if line_model: - self.feedLine_dict[f'{Constant.dropLine_set_section}{i}'] = line_model - self.updateUI_Select_Line() + # for i in range(1,Constant.MAX_Line_num): + # line_model = self.drop_position_manager.load_path_points(i) + # if line_model: + # self.feedLine_dict[f'{Constant.dropLine_set_section}{i}'] = line_model + line_model = DropPositionManager(Constant.dropLine_set_file).load_path_points(1) + if line_model: + self.feedLine_dict[f'{Constant.dropLine_set_section}-50'] = line_model + line_model = DropPositionManager(Constant.dropLine_set_file_35).load_path_points(1) + if line_model: + self.feedLine_dict[f'{Constant.dropLine_set_section}-35'] = line_model + + # self.updateUI_Select_Line() + # 9/29 初始化线名选择框 和 重量选择框 + self.updateui_select_line_by_feedLine_ini() + self.updateui_select_dropweight_by_drop_ini() pass def init_robot_info(self): @@ -987,18 +1006,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.relay_controller._running=True self.relay_controller.pause_start_sensor(True) - self.detect_person_thread = Thread(target=self.run_detect_persion,name="run_detect_persion") + #self.detect_person_thread = Thread(target=self.run_detect_persion,name="run_detect_persion") # self.camera_threading = Thread(target=self.camera_img.run,name="camera",daemon=True) self.main_threading.start() self.reset_threading.start() if not Constant.DebugPosition: self.robot_connect_threading.start() # self.main_UI_threading.start() - self.detect_person_thread.start() - self.emergency_thread.start() + #self.detect_person_thread.start() + self.emergency_thread.start() #启动传感器线程 - self.sensor_thread.start() - self.sensor2_thread.start() + self.sensor_thread.start() + self.sensor2_thread.start() # self.camera_threading.start() @@ -1070,18 +1089,22 @@ class MainWindow(QMainWindow, Ui_MainWindow): return log.log_message(logging.INFO, '第一层确认生产') - has_person = False - # has_person, _ = self.detection_person.get_person() # TODO - if has_person: # TODO - # self.feeding.pause = True - # self.send_pause_command(True) - # - # self.show_messagebox_of_person() - msg_box_person.setText("检测到安全区域后人是否继续生产?") - result = msg_box_person.exec() - if msg_box_person.clickedButton() == cancel_button: - return - log.log_message(logging.ERROR, '人员进入安全区') + # has_person = False + # # has_person, _ = self.detection_person.get_person() # TODO + # if has_person: # TODO + # # self.feeding.pause = True + # # self.send_pause_command(True) + # # + # # self.show_messagebox_of_person() + # msg_box_person.setText("检测到安全区域后人是否继续生产?") + # result = msg_box_person.exec() + # if msg_box_person.clickedButton() == cancel_button: + # return + # log.log_message(logging.ERROR, '人员进入安全区') + msg_box_person.setText(f"确认当前码垛重量是 {self.remain_drop_weight}KG!!") + result = msg_box_person.exec() + if msg_box_person.clickedButton() == cancel_button: + return #QSlide控件默认的最大值为99 num = self.horizontalSlider_feedingNum.maximum() # if num==99: @@ -1089,14 +1112,32 @@ class MainWindow(QMainWindow, Ui_MainWindow): line_head = self.comboBox_lineIndex.currentData() if self.feeding.feedConfig: self.remain_Count=self.feeding.feedConfig.remain_count + msg_box_person.setText(f"当前是从第{self.remain_Count+1}袋开始,总共需要{num}袋") result = msg_box_person.exec() if msg_box_person.clickedButton() == cancel_button: return self.label_button_status.setText("运行中...") + if self.remain_drop_weight == '35': + self.drop_position_manager=DropPositionManager(Constant.dropLine_set_file_35) + self.relay_controller.set_drop_35(True) + else: + self.drop_position_manager=DropPositionManager(Constant.dropLine_set_file) + self.relay_controller.set_drop_35(False) # num=25 #先默认30包码垛 - self.command_quene.put(FeedCommand(FeedingConfig(num, FeedLine(self.feedLine_dict[line_head].id,self.feedLine_dict[line_head].name,self.feedLine_dict[line_head].positions,self.remain_Count), self.feeding.robotClient.photo_locs[:],self.remain_Count))) + self.command_quene.put( + FeedCommand( + FeedingConfig(num, + FeedLine( + self.feedLine_dict[line_head].id, + self.feedLine_dict[line_head].name, + self.feedLine_dict[line_head].positions, + self.remain_Count, + self.drop_position_manager + ) + , self.feeding.robotClient.photo_locs[:],self.remain_Count + ))) # self.stackedWidget_num.setCurrentIndex(1) self.set_run_status_button(True) self.feeding.pause = False @@ -1184,7 +1225,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): def send_numkeybord_click(self): # 创建数字键盘对话框 num_dialog = QDialog(self) - num_dialog.setWindowTitle("数字键盘") + num_dialog.setWindowTitle("选择已码垛数") num_dialog.setWindowFlags(num_dialog.windowFlags() & ~Qt.WindowCloseButtonHint) num_dialog.setFixedSize(400, 500) @@ -1454,14 +1495,14 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.show_infomessage_box("急停按钮已按下,不能暂停,请先松开急停按钮") return if self.feeding.feedStatus == FeedStatus.FNone: - self.show_infomessage_box("当前没有运行中的工作,不能暂停") + self.show_infomessage_box("没有启动,不能暂停") return self.send_pauseFeed_click() pass def send_pauseFeed_click(self): """暂停/继续工作""" - if self.pushButton_pauseFeed.text() == '暂停': + if self.pushButton_pauseFeed.text() == '暂停': self.relay_controller.pause_start_sensor(True) icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot)) self.pushButton_pauseFeed.setIcon(icon9) @@ -1471,16 +1512,24 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.send_pause_command(True) self.feeding.pause = True else: - self.relay_controller.pause_start_sensor(False) - icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause)) - self.pushButton_pauseFeed.setIcon(icon9) - self.pushButton_pauseFeed.setText('暂停') - self.label_button_status.setText("运行中...") - self.send_pause_command(False) - log.log_message(logging.INFO, Constant.str_feed_continue) - self.send_start_tool_command() - log.log_message(logging.INFO, Constant.str_sys_start_tool) - self.feeding.pause = False + #暂停后pushButton_pauseFeed的值是继续,再按急停,停止传感器和机械臂 + #is_emergency_pressed True没按下,False按下 + if self.is_emergency_pressed: + #已暂停,按急停 + self.relay_controller.pause_start_sensor(True) + self.send_pause_command(True) + self.feeding.pause = True + else: + self.relay_controller.pause_start_sensor(False) + icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause)) + self.pushButton_pauseFeed.setIcon(icon9) + self.pushButton_pauseFeed.setText('暂停') + self.label_button_status.setText("运行中...") + self.send_pause_command(False) + log.log_message(logging.INFO, Constant.str_feed_continue) + self.send_start_tool_command() + log.log_message(logging.INFO, Constant.str_sys_start_tool) + self.feeding.pause = False def send_tabWidget_control_change(self): @@ -1727,8 +1776,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): else: if self.feeding.feedStatus == FeedStatus.FNone: self.stackedWidget_num.setCurrentIndex(0) + self.comboBox_dropWeight.setDisabled(False) else: self.stackedWidget_num.setCurrentIndex(1) + self.comboBox_dropWeight.setDisabled(True) self.label_date.setText(datetime.now().strftime("%Y-%m-%d")) @@ -1766,6 +1817,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): # self.feeding.pause = True # self.relay_controller.pause_start_sensor(True) self.stop_all_work() + self.relay_controller.close(blow_sensor2=True) msg_box_finish = QMessageBox() msg_box_finish.setIcon(QMessageBox.Icon.Warning) msg_box_finish.setText("码垛完成,请移走拖板") @@ -1816,8 +1868,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): if emergency_pressed: if not self.is_emergency_pressed: print('急停按钮按下') - self.send_pauseFeed_click() self.is_emergency_pressed = True + self.send_pauseFeed_click() self.label_button_status.setText("急停中,禁止操作") else: if self.is_emergency_pressed: @@ -1873,6 +1925,127 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.comboBox_lineIndex.clear() for key, value in self.feedLine_dict.items(): self.comboBox_lineIndex.addItem(value.name, key) + + + # 9/29: 只需要加载FeedLine.ini中的name 作为comboBox_lineIndex的选项 + def updateui_select_line_by_feedLine_ini(self): + self.comboBox_lineIndex.clear() + configReader = configparser.ConfigParser() + configReader.read(Constant.feedLine_set_file, encoding="utf-8") + for index in range(1, Constant.MAX_Line_num): + section = f"{Constant.feedLine_set_section}{index}" + if configReader.has_section(section): + line_name = configReader.get(section, "name") + self.comboBox_lineIndex.addItem(line_name, section) + + # 设置初始化选中,初始选中 f'{Constant.feedLine_set_section}{self.remain_linename}' + if self.remain_lineName: + selected_value = f"{Constant.feedLine_set_section}{self.remain_lineName}" + selected_index = self.comboBox_lineIndex.findData(selected_value) + if selected_index >= 0: + self.comboBox_lineIndex.setCurrentIndex(selected_index) + + # 9/29 初始化加载 drop.ini 中的name,获取预先设置的重量 + def updateui_select_dropweight_by_drop_ini(self): + self.comboBox_dropWeight.clear() + configReader = configparser.ConfigParser() + # 读取重量路径配置文件 drop.ini + configReader.read(Constant.dropLine_set_file, encoding="utf-8") + + # drop_name匹配xxxkg获取重量 + weight_pattern = re.compile(r'(\d+kg)') + + for index in range(1, Constant.MAX_Line_num): + section = f"{Constant.dropLine_set_section}{index}" + if configReader.has_section(section): + drop_name = configReader.get(section, "name") + match = weight_pattern.search(drop_name) + if match: + # 提取匹配到的内容(如"50kg") + weight_text = match.group(1) + else: + # 无法匹配xxxkg, 则使用"未知重量" + weight_text = "未知重量" + # userData: 如 DropLine50kg + userData = f"{Constant.dropLine_set_section}{weight_text}" + self.comboBox_dropWeight.addItem(weight_text, userData) + + # 连接槽函数 + self.comboBox_dropWeight.activated.connect(self.on_drop_weight_changed) + + # 设置初始化选中的重量 + if self.remain_drop_weight: + # selected_value: 如 DropLine50kg + selected_value = f"{Constant.dropLine_set_section}{self.remain_drop_weight}kg" + selected_index = self.comboBox_dropWeight.findData(selected_value) + if selected_index >= 0: + self.comboBox_dropWeight.setCurrentIndex(selected_index) + self.drop_weight_index=selected_index + # 初始化重量提示标签 + self.weight_label_info.setText(f"{self.remain_drop_weight}kg码垛") + + + """9/29 重量下拉框选中项变化时, 更新self.remain_drop_weight""" + def on_drop_weight_changed(self, index): + #提示 + msgBox = QMessageBox(self) + msgBox.setIcon(QMessageBox.Icon.Information) + msgBox.setText("会从第1包开始,是否继续?") + msgBox.setWindowTitle("提示") + font=QFont("Microsoft YaHei UI",40) + msgBox.setFont(font) + ok_button = msgBox.addButton("是", PySide6.QtWidgets.QMessageBox.ButtonRole.AcceptRole) + cancel_button = msgBox.addButton("否", PySide6.QtWidgets.QMessageBox.ButtonRole.RejectRole) + + ok_button.setStyleSheet("QPushButton { color: #fff; background-color: red;margin-right: 80px;padding:15px;font-size:40px }") + cancel_button.setStyleSheet("QPushButton { margin-right: 10px;padding:15px;font-size:40px }") + # msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + result = msgBox.exec() + if msgBox.clickedButton() == cancel_button: + self.comboBox_dropWeight.setCurrentIndex(self.drop_weight_index) + return + else: + self.drop_weight_index=index + # 默认的重量为 50 kg + default_weight = '50' + + if index < 0: # 没有选中项时(如下拉框为空) + self.remain_drop_weight = default_weight + return + + # 获取当前选中项的显示文本(如"50kg") + selected_text = self.comboBox_dropWeight.currentText() + + # 提取重量数值(从"50kg"中提取"50") + weight_pattern = re.compile(r'(\d+)kg') + match = weight_pattern.search(selected_text) + if match: + # 提取数字部分(如"50") + self.remain_drop_weight = match.group(1) + else: + # 若为"未知重量",remain_drop_weight 也为 default_weight + self.remain_drop_weight = default_weight + + # 更新上方的码垛重量提示Tips: + self.weight_label_info.setText(f"{selected_text}码垛") + self.remain_Count=0 + if self.feeding.feedConfig: + self.feeding.feedConfig.remain_count = 0 + + self.label_remain_num.setText('0') + + #35KG + if self.remain_drop_weight=='35': + self.label_maxNum.setText('40') + self.horizontalSlider_feedingNum.setMaximum(40) + self.maduo_Count=40 + else: + self.label_maxNum.setText('30') + self.horizontalSlider_feedingNum.setMaximum(30) + self.maduo_Count=30 + self.record_weight_ini(self.remain_Count,self.maduo_Count,self.remain_drop_weight) + + def updateUI_label_status(self): if self.robotClient.status_model.isMoving==1: self.label_move_sign.show() @@ -2369,6 +2542,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.feeding.onekey = True def send_exit_button_click(self): + if self.feeding.feedStatus != FeedStatus.FNone: + self.show_infomessage_box("请先停止后,再退出程序") + return self.close() # self.closeEvent(None) # QApplication.quit() @@ -2426,6 +2602,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): except: log.log_message(logging.ERROR, Constant.str_sys_log_feedNum) + #记录投料袋数 + def record_weight_ini(self,remain_count,maduo_count,drop_weight): + try: + self.configReader = configparser.ConfigParser() + self.configReader.read(Constant.set_ini) + self.configReader.set('Robot_Feed', 'remain_count', str(remain_count)) + self.configReader.set('Robot_Feed', 'maduo_count', str(maduo_count)) + self.configReader.set('Robot_Feed', 'remain_dropweight_kg', str(drop_weight)) + self.configReader.write(open(Constant.set_ini, 'w', encoding='utf-8')) + except: + log.log_message(logging.ERROR, Constant.str_sys_log_feedNum+"2") + class MyApplication(QApplication): def __init__(self, argv): diff --git a/test.py b/test.py deleted file mode 100644 index 941d1a2..0000000 --- a/test.py +++ /dev/null @@ -1,51 +0,0 @@ -from PySide6.QtCore import QThread, Signal, Slot -from PySide6.QtWidgets import QApplication, QDialog, QLabel, QVBoxLayout, QPushButton -import sys -import time - -# 定义子线程类 -class WorkerThread(QThread): - # 创建信号,子线程处理完成后通知主线程弹窗 - show_dialog_signal = Signal(str) - - def run(self): - # 模拟子线程的工作 - time.sleep(3) # 假设任务执行需要 3 秒钟 - self.show_dialog_signal.emit("任务完成,弹出对话框") # 发出信号,通知主线程弹窗 - print("子线程") - -# 定义主窗口类 -class MainWindow(QDialog): - def __init__(self): - super().__init__() - self.setWindowTitle("主窗口") - self.setGeometry(100, 100, 300, 200) - - self.button = QPushButton("开始任务", self) - self.button.clicked.connect(self.start_task) - - layout = QVBoxLayout(self) - layout.addWidget(self.button) - - @Slot(str) - def show_dialog(self, message): - # 接收到信号后显示弹窗 - dialog = QDialog(self) - dialog.setWindowTitle("子线程通知") - label = QLabel(message, dialog) - dialog_layout = QVBoxLayout(dialog) - dialog_layout.addWidget(label) - dialog.exec() - - def start_task(self): - # 创建并启动子线程 - self.thread = WorkerThread() - self.thread.show_dialog_signal.connect(self.show_dialog) # 连接信号到主线程的槽函数 - self.thread.start() - -# 创建应用程序 -app = QApplication(sys.argv) -window = MainWindow() -window.show() - -sys.exit(app.exec()) diff --git a/test2.py b/test2.py deleted file mode 100644 index be5297b..0000000 --- a/test2.py +++ /dev/null @@ -1,54 +0,0 @@ -import threading - -from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox -from PySide6.QtCore import QThread, Signal, QObject - -class Worker: - # 定义一个类属性的信号 - - def __init__(self): - self.task_done_signal = Signal(str) - def run_task(self): - import time - time.sleep(2) # 模拟耗时操作 - # 发送信号 - self.task_done_signal.emit("子线程任务完成!") - - -class MainWindow(QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle("子线程信号示例") - self.setGeometry(200, 200, 400, 300) - - # 添加按钮 - self.button = QPushButton("启动子线程", self) - self.button.setGeometry(100, 100, 200, 50) - self.button.clicked.connect(self.run_task) - - # 创建子线程和工作者对象 - self.worker_thread = threading.Thread(target=self.run_task) - self.worker = Worker() - - # 连接信号和槽 - self.worker.task_done_signal.connect(self.show_message) - - def run_task(self): - # 启动子线程 - self.worker_thread.start() - - def show_message(self, message): - # 显示来自子线程的消息 - QMessageBox.information(self, "任务完成", message) - - # 停止子线程 - self.worker_thread.quit() - self.worker_thread.wait() - -if __name__ == "__main__": - app = QApplication([]) - - window = MainWindow() - window.show() - - app.exec() diff --git a/test6.py b/test6.py deleted file mode 100644 index 59f4bc6..0000000 --- a/test6.py +++ /dev/null @@ -1,37 +0,0 @@ -import os -import sys -import time -from Mv3D.CameraUtil import CameraUtil -from Mv3D.calculate_diff2 import calculate_offset_from_image - -if __name__=='__main__': - - camera_img=CameraUtil() - loc_image_path=camera_img.save_img() - print(f"保存图片路径:{loc_image_path}") - try: - loc_model_result = calculate_offset_from_image(loc_image_path, visualize=False) - if loc_model_result['success']: - #置信度 - if loc_model_result['obj_conf']>0.5: - loc_offsetX=loc_model_result['dx_mm'] - if abs(loc_model_result['dx_mm'])<200: - loc_is_next=True - print(f'{loc_image_path}:料带偏移{loc_offsetX}mm') - else: - print(f"{loc_image_path}:料带偏移过大,报警") - # self.feed_error_signal.emit(1,f"{loc_image_path}:料带偏移过大,报警") - else: - print(f"{loc_image_path}:未检测到料带,置信度低") - # self.feed_error_signal.emit(2,f"{loc_image_path}:未检测到料带,置信度低") - else: - print(f"{loc_image_path}:计算偏移失败,视觉返回False") - # self.feed_error_signal.emit(2,f"{loc_image_path}:计算偏移失败,视觉返回False") - # loc_is_next=False - loc_offsetX=0 - except Exception as e: - print(f"{loc_image_path}:计算偏移失败:{e}") - - time.sleep(10) - - diff --git a/test_ui.py b/test_ui.py deleted file mode 100644 index f9a01cd..0000000 --- a/test_ui.py +++ /dev/null @@ -1,39 +0,0 @@ -import sys -import cv2 -from PyQt5.QtGui import QImage, QPixmap -from PySide6.QtWidgets import QApplication, QLabel, QMainWindow - - -def cv2_to_qimage(cv_img): - """Convert an OpenCV image to QImage.""" - height, width, channel = cv_img.shape - bytes_per_line = 3 * width - q_img = QImage(cv_img.data, width, height, bytes_per_line, QImage.Format_BGR888) - return q_img - - -class MainWindow(QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle("Display Image with PySide6") - self.resize(800, 600) - - - # 使用 OpenCV 读取图像 - cv_img = cv2.imread("./Image/1.png") # 替换为实际路径 - img = cv_img.copy() - # 转换为 QImage img = cv_img.copy() - q_img = cv2_to_qimage(cv_img) - - # 创建 QLabel 并设置图像 - label = QLabel(self) - label.setPixmap(QPixmap.fromImage(q_img)) - label.setScaledContents(True) - label.setGeometry(50, 50, 700, 500) # 调整位置和大小 - - -if __name__ == "__main__": - app = QApplication(sys.argv) - window = MainWindow() - window.show() - sys.exit(app.exec()) diff --git a/ui_MainWin - 副本 (2).py b/ui_MainWin - 副本 (2).py deleted file mode 100644 index 85e0082..0000000 --- a/ui_MainWin - 副本 (2).py +++ /dev/null @@ -1,4889 +0,0 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'MainWin.ui' -## -## Created by: Qt User Interface Compiler version 6.7.2 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import ( - QCoreApplication, - QDate, - QDateTime, - QLocale, - QMetaObject, - QObject, - QPoint, - QRect, - QSize, - QTime, - QUrl, - Qt, -) -from PySide6.QtGui import ( - QBrush, - QColor, - QConicalGradient, - QCursor, - QFont, - QFontDatabase, - QGradient, - QIcon, - QImage, - QKeySequence, - QLinearGradient, - QPainter, - QPalette, - QPixmap, - QRadialGradient, - QTransform, -) -from PySide6.QtWidgets import ( - QApplication, - QComboBox, - QFrame, - QGridLayout, - QHBoxLayout, - QHeaderView, - QLabel, - QLayout, - QLineEdit, - QMainWindow, - QPushButton, - QSizePolicy, - QSlider, - QStackedWidget, - QTabWidget, - QTableWidget, - QTableWidgetItem, - QTextEdit, - QVBoxLayout, - QWidget, -) - -from toggleswitch import ToggleSwitch -import MainRecources_rc - - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - if not MainWindow.objectName(): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(995, 733) - sizePolicy = QSizePolicy( - QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred - ) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) - MainWindow.setSizePolicy(sizePolicy) - self.centralwidget = QWidget(MainWindow) - self.centralwidget.setObjectName("centralwidget") - self.verticalLayout = QVBoxLayout(self.centralwidget) - self.verticalLayout.setSpacing(0) - self.verticalLayout.setObjectName("verticalLayout") - self.verticalLayout.setContentsMargins(0, 0, 0, 0) - self.frame_head = QFrame(self.centralwidget) - self.frame_head.setObjectName("frame_head") - sizePolicy1 = QSizePolicy( - QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding - ) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.frame_head.sizePolicy().hasHeightForWidth()) - self.frame_head.setSizePolicy(sizePolicy1) - self.frame_head.setStyleSheet("background-color: #0D1128;") - self.frame_head.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_head.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout = QHBoxLayout(self.frame_head) - self.horizontalLayout.setSpacing(0) - self.horizontalLayout.setObjectName("horizontalLayout") - self.horizontalLayout.setContentsMargins(0, 0, 0, 0) - self.frame_4 = QFrame(self.frame_head) - self.frame_4.setObjectName("frame_4") - sizePolicy1.setHeightForWidth(self.frame_4.sizePolicy().hasHeightForWidth()) - self.frame_4.setSizePolicy(sizePolicy1) - self.frame_4.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_4.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_2 = QHBoxLayout(self.frame_4) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.label = QLabel(self.frame_4) - self.label.setObjectName("label") - sizePolicy1.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) - self.label.setSizePolicy(sizePolicy1) - self.label.setStyleSheet( - "border-image: url(:/main/Image/title_ico.png) 0 0 0 0 strech;\n" - "border-width: 5px 1px 3px 4px; \n" - "border-style: solid; " - ) - self.label.setScaledContents(False) - - self.horizontalLayout_2.addWidget(self.label) - - self.label_2 = QLabel(self.frame_4) - self.label_2.setObjectName("label_2") - sizePolicy1.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) - self.label_2.setSizePolicy(sizePolicy1) - self.label_2.setStyleSheet( - "color: #DBF4F5;\n" 'font: 700 12pt "Microsoft YaHei UI";' - ) - - self.horizontalLayout_2.addWidget(self.label_2) - - self.horizontalLayout_2.setStretch(0, 2) - self.horizontalLayout_2.setStretch(1, 10) - - self.horizontalLayout.addWidget(self.frame_4) - - self.frame = QFrame(self.frame_head) - self.frame.setObjectName("frame") - sizePolicy1.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) - self.frame.setSizePolicy(sizePolicy1) - self.frame.setStyleSheet( - "background-color: rgb(16, 21, 49);\n" "border: 1px solid #122041;" - ) - self.frame.setFrameShape(QFrame.Shape.StyledPanel) - self.frame.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_3 = QHBoxLayout(self.frame) - self.horizontalLayout_3.setSpacing(0) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.horizontalLayout_3.setSizeConstraint( - QLayout.SizeConstraint.SetDefaultConstraint - ) - self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) - self.pushButton = QPushButton(self.frame) - self.pushButton.setObjectName("pushButton") - sizePolicy1.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) - self.pushButton.setSizePolicy(sizePolicy1) - self.pushButton.setStyleSheet( - "\n" - "*{\n" - "color:#3479BE;\n" - "background-color: #111633;\n" - 'font: 12pt "Microsoft YaHei UI";\n' - "border: 1px;\n" - "padding:18px;\n" - "\n" - "}\n" - "*:hover{\n" - "color:#ffffff;\n" - "border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" - "background-color: #1A3E79;\n" - "}\n" - "*:pressed\n" - "{\n" - "color:#ffffff;\n" - "border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" - "background-color: #1A3E79;\n" - "}\n" - "" - ) - - self.horizontalLayout_3.addWidget(self.pushButton) - - self.pushButton_2 = QPushButton(self.frame) - self.pushButton_2.setObjectName("pushButton_2") - sizePolicy1.setHeightForWidth( - self.pushButton_2.sizePolicy().hasHeightForWidth() - ) - self.pushButton_2.setSizePolicy(sizePolicy1) - self.pushButton_2.setStyleSheet( - "\n" - "*{\n" - "color:#3479BE;\n" - "background-color: #111633;\n" - 'font: 12pt "Microsoft YaHei UI";\n' - "border: 1px;\n" - "padding:18px;\n" - "\n" - "}\n" - "*:pressed\n" - "{\n" - "color:#ffffff;\n" - "border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" - "background-color: #1A3E79;\n" - "}\n" - "" - ) - - self.horizontalLayout_3.addWidget(self.pushButton_2) - - self.pushButton_3 = QPushButton(self.frame) - self.pushButton_3.setObjectName("pushButton_3") - sizePolicy1.setHeightForWidth( - self.pushButton_3.sizePolicy().hasHeightForWidth() - ) - self.pushButton_3.setSizePolicy(sizePolicy1) - self.pushButton_3.setStyleSheet( - "\n" - "*{\n" - "color:#3479BE;\n" - "background-color: #111633;\n" - 'font: 12pt "Microsoft YaHei UI";\n' - "border: 1px;\n" - "padding:18px;\n" - "\n" - "}\n" - "*:pressed\n" - "{\n" - "color:#ffffff;\n" - "border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" - "background-color: #1A3E79;\n" - "}\n" - "" - ) - - self.horizontalLayout_3.addWidget(self.pushButton_3) - - self.pushButton_4 = QPushButton(self.frame) - self.pushButton_4.setObjectName("pushButton_4") - sizePolicy1.setHeightForWidth( - self.pushButton_4.sizePolicy().hasHeightForWidth() - ) - self.pushButton_4.setSizePolicy(sizePolicy1) - self.pushButton_4.setStyleSheet( - "\n" - "*{\n" - "color:#3479BE;\n" - "background-color: #111633;\n" - 'font: 12pt "Microsoft YaHei UI";\n' - "border: 1px;\n" - "padding:18px;\n" - "\n" - "}\n" - "*:pressed\n" - "{\n" - "color:#ffffff;\n" - "border-image: url(:/main/Image/backgroud_head_btn.jpg);\n" - "background-color: #1A3E79;\n" - "}\n" - "" - ) - - self.horizontalLayout_3.addWidget(self.pushButton_4) - - self.horizontalLayout.addWidget(self.frame) - - self.frame_3 = QFrame(self.frame_head) - self.frame_3.setObjectName("frame_3") - sizePolicy1.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth()) - self.frame_3.setSizePolicy(sizePolicy1) - self.frame_3.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_3.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_5 = QHBoxLayout(self.frame_3) - self.horizontalLayout_5.setObjectName("horizontalLayout_5") - self.pushButton_5 = QPushButton(self.frame_3) - self.pushButton_5.setObjectName("pushButton_5") - sizePolicy1.setHeightForWidth( - self.pushButton_5.sizePolicy().hasHeightForWidth() - ) - self.pushButton_5.setSizePolicy(sizePolicy1) - self.pushButton_5.setStyleSheet( - "*{\n" - "color:#838992;\n" - "background-color: #1B1F34;\n" - 'font: 9pt "Microsoft YaHei UI";\n' - "border: 1px solid #282B40;\n" - "}\n" - "*:pressed\n" - "{\n" - "color:#ffffff;\n" - "background-color: #1A3E79;\n" - "}\n" - "" - ) - icon = QIcon() - icon.addFile( - ":/main/Image/login.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off - ) - self.pushButton_5.setIcon(icon) - - self.horizontalLayout_5.addWidget(self.pushButton_5) - - self.pushButton_exit = QPushButton(self.frame_3) - self.pushButton_exit.setObjectName("pushButton_exit") - sizePolicy1.setHeightForWidth( - self.pushButton_exit.sizePolicy().hasHeightForWidth() - ) - self.pushButton_exit.setSizePolicy(sizePolicy1) - self.pushButton_exit.setStyleSheet( - "*{\n" - "color:#838992;\n" - "background-color: #1B1F34;\n" - 'font: 9pt "Microsoft YaHei UI";\n' - "border: 1px solid #282B40;\n" - "}\n" - "*:pressed\n" - "{\n" - "color:#ffffff;\n" - "background-color: #1A3E79;\n" - "}\n" - "" - ) - icon1 = QIcon() - icon1.addFile( - ":/main/Image/logout.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off - ) - self.pushButton_exit.setIcon(icon1) - - self.horizontalLayout_5.addWidget(self.pushButton_exit) - - self.horizontalLayout.addWidget(self.frame_3) - - self.horizontalLayout.setStretch(0, 45) - self.horizontalLayout.setStretch(1, 137) - self.horizontalLayout.setStretch(2, 59) - - self.verticalLayout.addWidget(self.frame_head) - - self.frame_main = QFrame(self.centralwidget) - self.frame_main.setObjectName("frame_main") - self.frame_main.setStyleSheet("background-color: #0D1128;") - self.frame_main.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_main.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_4 = QHBoxLayout(self.frame_main) - self.horizontalLayout_4.setSpacing(0) - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) - self.frame_left_menu = QFrame(self.frame_main) - self.frame_left_menu.setObjectName("frame_left_menu") - sizePolicy1.setHeightForWidth( - self.frame_left_menu.sizePolicy().hasHeightForWidth() - ) - self.frame_left_menu.setSizePolicy(sizePolicy1) - self.frame_left_menu.setStyleSheet( - "background-color: #0D1128;\n" "border: 1px solid #324C82;" - ) - self.verticalLayout_2 = QVBoxLayout(self.frame_left_menu) - self.verticalLayout_2.setSpacing(8) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.verticalLayout_2.setSizeConstraint( - QLayout.SizeConstraint.SetDefaultConstraint - ) - self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) - self.frame_2 = QFrame(self.frame_left_menu) - self.frame_2.setObjectName("frame_2") - sizePolicy2 = QSizePolicy( - QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed - ) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) - self.frame_2.setSizePolicy(sizePolicy2) - self.frame_2.setStyleSheet("background-color: #0D1128;\n" "border: none;") - self.frame_2.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_2.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_3 = QVBoxLayout(self.frame_2) - self.verticalLayout_3.setSpacing(0) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) - self.pushButton_sysseting = QPushButton(self.frame_2) - self.pushButton_sysseting.setObjectName("pushButton_sysseting") - sizePolicy3 = QSizePolicy( - QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed - ) - sizePolicy3.setHorizontalStretch(0) - sizePolicy3.setVerticalStretch(0) - sizePolicy3.setHeightForWidth( - self.pushButton_sysseting.sizePolicy().hasHeightForWidth() - ) - self.pushButton_sysseting.setSizePolicy(sizePolicy3) - self.pushButton_sysseting.setStyleSheet( - " QPushButton {\n" - " \n" - " color: white; /* \u6309\u94ae\u6587\u672c\u989c\u8272 */\n" - " background-color: rgb(25, 30, 54);\n" - " padding: 10px ; /* \u6309\u94ae\u5185\u8fb9\u8ddd */\n" - ' font: 12pt "Microsoft YaHei UI";\n' - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn.jpg);\n" - " }" - ) - icon2 = QIcon() - icon2.addFile( - ":/main/Image/icon_leftMenu_btn_sys.svg", - QSize(), - QIcon.Mode.Normal, - QIcon.State.Off, - ) - self.pushButton_sysseting.setIcon(icon2) - self.pushButton_sysseting.setIconSize(QSize(20, 20)) - - self.verticalLayout_3.addWidget(self.pushButton_sysseting) - - self.frame_sys_seting = QFrame(self.frame_2) - self.frame_sys_seting.setObjectName("frame_sys_seting") - sizePolicy4 = QSizePolicy( - QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding - ) - sizePolicy4.setHorizontalStretch(0) - sizePolicy4.setVerticalStretch(0) - sizePolicy4.setHeightForWidth( - self.frame_sys_seting.sizePolicy().hasHeightForWidth() - ) - self.frame_sys_seting.setSizePolicy(sizePolicy4) - self.frame_sys_seting.setStyleSheet("\n" "background-color: rgb(13, 17, 40);") - self.frame_sys_seting.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_sys_seting.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_6 = QHBoxLayout(self.frame_sys_seting) - self.horizontalLayout_6.setSpacing(0) - self.horizontalLayout_6.setObjectName("horizontalLayout_6") - self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) - self.frame_9 = QFrame(self.frame_sys_seting) - self.frame_9.setObjectName("frame_9") - self.frame_9.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_9.setFrameShadow(QFrame.Shadow.Raised) - - self.horizontalLayout_6.addWidget(self.frame_9) - - self.frame_10 = QFrame(self.frame_sys_seting) - self.frame_10.setObjectName("frame_10") - self.frame_10.setStyleSheet("background-color: rgb(13, 17, 40);") - self.frame_10.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_10.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_4 = QVBoxLayout(self.frame_10) - self.verticalLayout_4.setObjectName("verticalLayout_4") - self.pushButton_leftmenu_produce = QPushButton(self.frame_10) - self.pushButton_leftmenu_produce.setObjectName("pushButton_leftmenu_produce") - sizePolicy5 = QSizePolicy( - QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding - ) - # sizePolicy5 = QSizePolicy( - # QSizePolicy.Policy.Expanding, # 水平方向 - # QSizePolicy.Policy.Expanding, # 垂直方向 - # ) - sizePolicy5.setHorizontalStretch(0) # 设置水平扩展 - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth( - self.pushButton_leftmenu_produce.sizePolicy().hasHeightForWidth() - ) - self.pushButton_leftmenu_produce.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_produce.setStyleSheet( - "\n" - "\n" - " QPushButton {\n" - " \n" - " background-color: rgb(16, 31, 63);\n" - " color: rgb(255, 255, 255);\n" - "\n" - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "\n" - " }\n" - "*:pressed\n" - "{\n" - "border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "}\n" - "" - ) - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_produce) - - self.pushButton_leftmenu_robot_seting = QPushButton(self.frame_10) - self.pushButton_leftmenu_robot_seting.setObjectName( - "pushButton_leftmenu_robot_seting" - ) - sizePolicy5.setHeightForWidth( - self.pushButton_leftmenu_robot_seting.sizePolicy().hasHeightForWidth() - ) - self.pushButton_leftmenu_robot_seting.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_robot_seting.setStyleSheet( - "\n" - "\n" - " QPushButton {\n" - " \n" - " background-color: rgb(16, 31, 63);\n" - " color: rgb(255, 255, 255);\n" - "\n" - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "\n" - " }\n" - "*:pressed\n" - "{\n" - "border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "}\n" - "" - ) - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_robot_seting) - - self.pushButton_leftmenu_IO = QPushButton(self.frame_10) - self.pushButton_leftmenu_IO.setObjectName("pushButton_leftmenu_IO") - sizePolicy5.setHeightForWidth( - self.pushButton_leftmenu_IO.sizePolicy().hasHeightForWidth() - ) - self.pushButton_leftmenu_IO.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_IO.setStyleSheet( - "\n" - "\n" - " QPushButton {\n" - " \n" - " background-color: rgb(16, 31, 63);\n" - " color: rgb(255, 255, 255);\n" - "\n" - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "\n" - " }\n" - "*:pressed\n" - "{\n" - "border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "}\n" - "" - ) - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_IO) - - self.pushButton_leftmenu_position = QPushButton(self.frame_10) - self.pushButton_leftmenu_position.setObjectName("pushButton_leftmenu_position") - sizePolicy5.setHeightForWidth( - self.pushButton_leftmenu_position.sizePolicy().hasHeightForWidth() - ) - self.pushButton_leftmenu_position.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_position.setStyleSheet( - "\n" - "\n" - " QPushButton {\n" - " \n" - " background-color: rgb(16, 31, 63);\n" - " color: rgb(255, 255, 255);\n" - "\n" - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "\n" - " }\n" - "*:pressed\n" - "{\n" - "border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "}\n" - "" - ) - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_position) - - self.pushButton_leftmenu_baseSeting = QPushButton(self.frame_10) - self.pushButton_leftmenu_baseSeting.setObjectName( - "pushButton_leftmenu_baseSeting" - ) - sizePolicy5.setHeightForWidth( - self.pushButton_leftmenu_baseSeting.sizePolicy().hasHeightForWidth() - ) - self.pushButton_leftmenu_baseSeting.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_baseSeting.setStyleSheet( - "\n" - "\n" - " QPushButton {\n" - " \n" - " background-color: rgb(16, 31, 63);\n" - " color: rgb(255, 255, 255);\n" - "\n" - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "\n" - " }\n" - "*:pressed\n" - "{\n" - "border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "}\n" - "" - ) - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_baseSeting) - - self.pushButton_leftmenu_posDebug = QPushButton(self.frame_10) - self.pushButton_leftmenu_posDebug.setObjectName("pushButton_leftmenu_posDebug") - sizePolicy5.setHeightForWidth( - self.pushButton_leftmenu_posDebug.sizePolicy().hasHeightForWidth() - ) - self.pushButton_leftmenu_posDebug.setSizePolicy(sizePolicy5) - self.pushButton_leftmenu_posDebug.setStyleSheet( - "\n" - "\n" - " QPushButton {\n" - " \n" - " background-color: rgb(16, 31, 63);\n" - " color: rgb(255, 255, 255);\n" - "\n" - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "\n" - " }\n" - "*:pressed\n" - "{\n" - "border-image: url(:/main/Image/backgroud_leftMenu_btn_child.jpg);\n" - "}\n" - "" - ) - - self.verticalLayout_4.addWidget(self.pushButton_leftmenu_posDebug) - - self.horizontalLayout_6.addWidget(self.frame_10) - - self.horizontalLayout_6.setStretch(0, 1) - self.horizontalLayout_6.setStretch(1, 7) - - self.verticalLayout_3.addWidget(self.frame_sys_seting) - - self.verticalLayout_3.setStretch(0, 15) - - self.verticalLayout_2.addWidget(self.frame_2) - - self.frame_5 = QFrame(self.frame_left_menu) - self.frame_5.setObjectName("frame_5") - self.frame_5.setStyleSheet("border: none;") - self.frame_5.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_5.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_6 = QVBoxLayout(self.frame_5) - self.verticalLayout_6.setSpacing(0) - self.verticalLayout_6.setObjectName("verticalLayout_6") - self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) - self.pushButton_11 = QPushButton(self.frame_5) - self.pushButton_11.setObjectName("pushButton_11") - sizePolicy6 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) - sizePolicy6.setHorizontalStretch(0) - sizePolicy6.setVerticalStretch(0) - sizePolicy6.setHeightForWidth( - self.pushButton_11.sizePolicy().hasHeightForWidth() - ) - self.pushButton_11.setSizePolicy(sizePolicy6) - self.pushButton_11.setStyleSheet( - " QPushButton {\n" - " \n" - " color: white; /* \u6309\u94ae\u6587\u672c\u989c\u8272 */\n" - " background-color: rgb(25, 30, 54);\n" - " padding: 10px ; /* \u6309\u94ae\u5185\u8fb9\u8ddd */\n" - ' font: 12pt "Microsoft YaHei UI";\n' - " }\n" - " QPushButton:hover {\n" - " border-image: url(:/main/Image/backgroud_leftMenu_btn.jpg);\n" - " }" - ) - icon3 = QIcon() - icon3.addFile( - ":/main/Image/icon_other.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off - ) - self.pushButton_11.setIcon(icon3) - self.pushButton_11.setIconSize(QSize(20, 20)) - - self.verticalLayout_6.addWidget(self.pushButton_11) - - self.frame_other_set = QFrame(self.frame_5) - self.frame_other_set.setObjectName("frame_other_set") - self.frame_other_set.setStyleSheet("\n" "background-color: rgb(13, 17, 40);") - self.frame_other_set.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_other_set.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_7 = QHBoxLayout(self.frame_other_set) - self.horizontalLayout_7.setSpacing(0) - self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) - self.frame_12 = QFrame(self.frame_other_set) - self.frame_12.setObjectName("frame_12") - self.frame_12.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_12.setFrameShadow(QFrame.Shadow.Raised) - - self.horizontalLayout_7.addWidget(self.frame_12) - - self.frame_13 = QFrame(self.frame_other_set) - self.frame_13.setObjectName("frame_13") - self.frame_13.setStyleSheet("background-color: rgb(13, 17, 40);") - self.frame_13.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_13.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_5 = QVBoxLayout(self.frame_13) - self.verticalLayout_5.setSpacing(5) - self.verticalLayout_5.setObjectName("verticalLayout_5") - self.verticalLayout_5.setContentsMargins(5, 5, 5, 5) - - self.horizontalLayout_7.addWidget(self.frame_13) - - self.horizontalLayout_7.setStretch(0, 1) - self.horizontalLayout_7.setStretch(1, 7) - - self.verticalLayout_6.addWidget(self.frame_other_set) - - self.verticalLayout_6.setStretch(0, 15) - self.verticalLayout_6.setStretch(1, 30) - - self.verticalLayout_2.addWidget(self.frame_5) - - self.verticalLayout_2.setStretch(0, 1) - self.verticalLayout_2.setStretch(1, 1) - - self.horizontalLayout_4.addWidget(self.frame_left_menu) - - self.frame_view = QFrame(self.frame_main) - self.frame_view.setObjectName("frame_view") - sizePolicy1.setHeightForWidth(self.frame_view.sizePolicy().hasHeightForWidth()) - self.frame_view.setSizePolicy(sizePolicy1) - self.frame_view.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_view.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_8 = QVBoxLayout(self.frame_view) - self.verticalLayout_8.setSpacing(0) - self.verticalLayout_8.setObjectName("verticalLayout_8") - self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) - self.stackedWidget_view = QStackedWidget(self.frame_view) - self.stackedWidget_view.setObjectName("stackedWidget_view") - sizePolicy1.setHeightForWidth( - self.stackedWidget_view.sizePolicy().hasHeightForWidth() - ) - self.stackedWidget_view.setSizePolicy(sizePolicy1) - self.page_3 = QWidget() - self.page_3.setObjectName("page_3") - self.verticalLayout_7 = QVBoxLayout(self.page_3) - self.verticalLayout_7.setSpacing(0) - self.verticalLayout_7.setObjectName("verticalLayout_7") - self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) - self.frame_14 = QFrame(self.page_3) - self.frame_14.setObjectName("frame_14") - self.frame_14.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_14.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_9 = QVBoxLayout(self.frame_14) - self.verticalLayout_9.setSpacing(0) - self.verticalLayout_9.setObjectName("verticalLayout_9") - self.verticalLayout_9.setContentsMargins(0, 0, 0, 0) - self.frame_showDetection = QFrame(self.frame_14) - self.frame_showDetection.setObjectName("frame_showDetection") - self.frame_showDetection.setStyleSheet("") - self.frame_showDetection.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_showDetection.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_14 = QVBoxLayout(self.frame_showDetection) - self.verticalLayout_14.setObjectName("verticalLayout_14") - self.frame_sign_2 = QFrame(self.frame_showDetection) - self.frame_sign_2.setObjectName("frame_sign_2") - sizePolicy1.setHeightForWidth( - self.frame_sign_2.sizePolicy().hasHeightForWidth() - ) - self.frame_sign_2.setSizePolicy(sizePolicy1) - self.frame_sign_2.setStyleSheet( - "background-color: rgba(255, 255, 255, 0);\n" "border-image: None;" - ) - self.frame_sign_2.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_sign_2.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_4 = QGridLayout(self.frame_sign_2) - self.gridLayout_4.setObjectName("gridLayout_4") - self.pushButton_sign_go = QPushButton(self.frame_sign_2) - self.pushButton_sign_go.setObjectName("pushButton_sign_go") - sizePolicy1.setHeightForWidth( - self.pushButton_sign_go.sizePolicy().hasHeightForWidth() - ) - self.pushButton_sign_go.setSizePolicy(sizePolicy1) - self.pushButton_sign_go.setStyleSheet( - "*{\n" - "background-color: #7A7A7A;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 5px;\n" - "}\n" - "*:disabled\n" - "{\n" - "background-color: #ff6e00;\n" - "}\n" - "\n" - "" - ) - - self.gridLayout_4.addWidget(self.pushButton_sign_go, 0, 0, 1, 1) - - self.label_sign_go = QLabel(self.frame_sign_2) - self.label_sign_go.setObjectName("label_sign_go") - sizePolicy1.setHeightForWidth( - self.label_sign_go.sizePolicy().hasHeightForWidth() - ) - self.label_sign_go.setSizePolicy(sizePolicy1) - self.label_sign_go.setStyleSheet( - "\n" - "QLabel:disabled{\n" - " background-color: rgba(255, 255, 255, 0);\n" - ' font: 700 12pt "Microsoft YaHei UI";\n' - " color: red;\n" - "}\n" - "\n" - "QLabel{\n" - "background-color: rgba(255, 255, 255, 0);\n" - 'font: 700 12pt "Microsoft YaHei UI";\n' - "color:#7A7A7A;\n" - "}" - ) - self.label_sign_go.setAlignment( - Qt.AlignmentFlag.AlignLeading - | Qt.AlignmentFlag.AlignLeft - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_4.addWidget(self.label_sign_go, 0, 1, 1, 1) - - self.pushButton_sign_photo = QPushButton(self.frame_sign_2) - self.pushButton_sign_photo.setObjectName("pushButton_sign_photo") - sizePolicy1.setHeightForWidth( - self.pushButton_sign_photo.sizePolicy().hasHeightForWidth() - ) - self.pushButton_sign_photo.setSizePolicy(sizePolicy1) - self.pushButton_sign_photo.setStyleSheet( - "*{\n" - "background-color: #7A7A7A;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 5px;\n" - "}\n" - "*:disabled\n" - "{\n" - "background-color: #ff6e00;\n" - "}\n" - "\n" - "" - ) - - self.gridLayout_4.addWidget(self.pushButton_sign_photo, 0, 2, 1, 1) - - self.label_sign_photo = QLabel(self.frame_sign_2) - self.label_sign_photo.setObjectName("label_sign_photo") - sizePolicy1.setHeightForWidth( - self.label_sign_photo.sizePolicy().hasHeightForWidth() - ) - self.label_sign_photo.setSizePolicy(sizePolicy1) - self.label_sign_photo.setStyleSheet( - "\n" - "QLabel:disabled{\n" - " background-color: rgba(255, 255, 255, 0);\n" - ' font: 700 12pt "Microsoft YaHei UI";\n' - " color: red;\n" - "}\n" - "\n" - "QLabel{\n" - "background-color: rgba(255, 255, 255, 0);\n" - 'font: 700 12pt "Microsoft YaHei UI";\n' - "color:#7A7A7A;\n" - "}" - ) - self.label_sign_photo.setAlignment( - Qt.AlignmentFlag.AlignLeading - | Qt.AlignmentFlag.AlignLeft - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_4.addWidget(self.label_sign_photo, 0, 3, 1, 1) - - self.pushButton_sign_take = QPushButton(self.frame_sign_2) - self.pushButton_sign_take.setObjectName("pushButton_sign_take") - sizePolicy1.setHeightForWidth( - self.pushButton_sign_take.sizePolicy().hasHeightForWidth() - ) - self.pushButton_sign_take.setSizePolicy(sizePolicy1) - self.pushButton_sign_take.setStyleSheet( - "*{\n" - "background-color: #7A7A7A;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 5px;\n" - "}\n" - "*:disabled\n" - "{\n" - "background-color: #ff6e00;\n" - "}\n" - "\n" - "" - ) - - self.gridLayout_4.addWidget(self.pushButton_sign_take, 0, 4, 1, 1) - - self.label_sign_take = QLabel(self.frame_sign_2) - self.label_sign_take.setObjectName("label_sign_take") - sizePolicy1.setHeightForWidth( - self.label_sign_take.sizePolicy().hasHeightForWidth() - ) - self.label_sign_take.setSizePolicy(sizePolicy1) - self.label_sign_take.setStyleSheet( - "\n" - "QLabel:disabled{\n" - " background-color: rgba(255, 255, 255, 0);\n" - ' font: 700 12pt "Microsoft YaHei UI";\n' - " color: red;\n" - "}\n" - "\n" - "QLabel{\n" - "background-color: rgba(255, 255, 255, 0);\n" - 'font: 700 12pt "Microsoft YaHei UI";\n' - "color:#7A7A7A;\n" - "}" - ) - self.label_sign_take.setAlignment( - Qt.AlignmentFlag.AlignLeading - | Qt.AlignmentFlag.AlignLeft - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_4.addWidget(self.label_sign_take, 0, 5, 1, 1) - - self.pushButton_sign_feed = QPushButton(self.frame_sign_2) - self.pushButton_sign_feed.setObjectName("pushButton_sign_feed") - sizePolicy1.setHeightForWidth( - self.pushButton_sign_feed.sizePolicy().hasHeightForWidth() - ) - self.pushButton_sign_feed.setSizePolicy(sizePolicy1) - self.pushButton_sign_feed.setStyleSheet( - "*{\n" - "background-color: #7A7A7A;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 5px;\n" - "}\n" - "*:disabled\n" - "{\n" - "background-color: #ff6e00;\n" - "}\n" - "\n" - "" - ) - - self.gridLayout_4.addWidget(self.pushButton_sign_feed, 0, 6, 1, 1) - - self.label_sign_feed = QLabel(self.frame_sign_2) - self.label_sign_feed.setObjectName("label_sign_feed") - sizePolicy1.setHeightForWidth( - self.label_sign_feed.sizePolicy().hasHeightForWidth() - ) - self.label_sign_feed.setSizePolicy(sizePolicy1) - self.label_sign_feed.setStyleSheet( - "\n" - "QLabel:disabled{\n" - " background-color: rgba(255, 255, 255, 0);\n" - ' font: 700 12pt "Microsoft YaHei UI";\n' - " color: red;\n" - "}\n" - "\n" - "QLabel{\n" - "background-color: rgba(255, 255, 255, 0);\n" - 'font: 700 12pt "Microsoft YaHei UI";\n' - "color:#7A7A7A;\n" - "}" - ) - self.label_sign_feed.setAlignment( - Qt.AlignmentFlag.AlignLeading - | Qt.AlignmentFlag.AlignLeft - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_4.addWidget(self.label_sign_feed, 0, 7, 1, 1) - - self.verticalLayout_14.addWidget(self.frame_sign_2) - - self.label_showDetection = QLabel(self.frame_showDetection) - self.label_showDetection.setObjectName("label_showDetection") - sizePolicy1.setHeightForWidth( - self.label_showDetection.sizePolicy().hasHeightForWidth() - ) - self.label_showDetection.setSizePolicy(sizePolicy1) - self.label_showDetection.setSizeIncrement(QSize(0, 0)) - self.label_showDetection.setBaseSize(QSize(0, 0)) - self.label_showDetection.setAutoFillBackground(False) - self.label_showDetection.setStyleSheet( - "background-image: url(:/main/Image/wait.png);\n" - "background-position: center;\n" - "background-repeat: no-repeat;\n" - " " - ) - self.label_showDetection.setScaledContents(False) - - self.verticalLayout_14.addWidget(self.label_showDetection) - - self.label_move_sign = QLabel(self.frame_showDetection) - self.label_move_sign.setObjectName("label_move_sign") - sizePolicy1.setHeightForWidth( - self.label_move_sign.sizePolicy().hasHeightForWidth() - ) - self.label_move_sign.setSizePolicy(sizePolicy1) - self.label_move_sign.setStyleSheet( - "background-color: rgba(255, 255, 255, 0);\n" - "color: red;\n" - "border-image: None;" - ) - self.label_move_sign.setAlignment( - Qt.AlignmentFlag.AlignBottom - | Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - ) - - self.verticalLayout_14.addWidget(self.label_move_sign) - - self.verticalLayout_14.setStretch(0, 1) - self.verticalLayout_14.setStretch(1, 20) - self.verticalLayout_14.setStretch(2, 1) - - self.verticalLayout_9.addWidget(self.frame_showDetection) - - self.frame_15 = QFrame(self.frame_14) - self.frame_15.setObjectName("frame_15") - self.frame_15.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_15.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_8 = QHBoxLayout(self.frame_15) - self.horizontalLayout_8.setSpacing(0) - self.horizontalLayout_8.setObjectName("horizontalLayout_8") - self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0) - self.frame_17 = QFrame(self.frame_15) - self.frame_17.setObjectName("frame_17") - sizePolicy.setHeightForWidth(self.frame_17.sizePolicy().hasHeightForWidth()) - self.frame_17.setSizePolicy(sizePolicy) - self.frame_17.setStyleSheet("border: 1px solid #324C82;") - self.frame_17.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_17.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_9 = QHBoxLayout(self.frame_17) - self.horizontalLayout_9.setSpacing(0) - self.horizontalLayout_9.setObjectName("horizontalLayout_9") - self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0) - self.tabWidget = QTabWidget(self.frame_17) - self.tabWidget.setObjectName("tabWidget") - sizePolicy1.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) - self.tabWidget.setSizePolicy(sizePolicy1) - self.tabWidget.setStyleSheet( - "\n" - "\n" - "QTabBar::tab {\n" - " background: #191E36;\n" - " padding: 10px;\n" - "border:None;\n" - " color:#ffffff\n" - "}\n" - "" - ) - self.tabWidget.setTabShape(QTabWidget.TabShape.Rounded) - self.tabWidget.setElideMode(Qt.TextElideMode.ElideNone) - self.tabWidget.setDocumentMode(True) - self.tabWidget.setTabsClosable(False) - self.tabWidget.setTabBarAutoHide(False) - self.tab = QWidget() - self.tab.setObjectName("tab") - self.horizontalLayout_13 = QHBoxLayout(self.tab) - self.horizontalLayout_13.setSpacing(0) - self.horizontalLayout_13.setObjectName("horizontalLayout_13") - self.horizontalLayout_13.setContentsMargins(0, 0, 0, 0) - self.textEdit_log_info = QTextEdit(self.tab) - self.textEdit_log_info.setObjectName("textEdit_log_info") - self.textEdit_log_info.setStyleSheet("color: rgb(255, 255, 255);") - - self.horizontalLayout_13.addWidget(self.textEdit_log_info) - - icon4 = QIcon() - icon4.addFile( - ":/main/Image/log.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off - ) - self.tabWidget.addTab(self.tab, icon4, "") - self.tab_2 = QWidget() - self.tab_2.setObjectName("tab_2") - self.horizontalLayout_14 = QHBoxLayout(self.tab_2) - self.horizontalLayout_14.setSpacing(0) - self.horizontalLayout_14.setObjectName("horizontalLayout_14") - self.horizontalLayout_14.setContentsMargins(0, 0, 0, 0) - self.textEdit_log_error = QTextEdit(self.tab_2) - self.textEdit_log_error.setObjectName("textEdit_log_error") - self.textEdit_log_error.setStyleSheet("\n" "color: rgb(255, 0, 0);") - - self.horizontalLayout_14.addWidget(self.textEdit_log_error) - - icon5 = QIcon() - icon5.addFile( - ":/main/Image/waring.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off - ) - self.tabWidget.addTab(self.tab_2, icon5, "") - - self.horizontalLayout_9.addWidget(self.tabWidget) - - self.horizontalLayout_8.addWidget(self.frame_17) - - self.frame_18 = QFrame(self.frame_15) - self.frame_18.setObjectName("frame_18") - self.frame_18.setStyleSheet("border: 1px solid #324C82;") - self.frame_18.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_18.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_13 = QVBoxLayout(self.frame_18) - self.verticalLayout_13.setObjectName("verticalLayout_13") - self.frame_25 = QFrame(self.frame_18) - self.frame_25.setObjectName("frame_25") - self.frame_25.setStyleSheet("border:None") - self.frame_25.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_25.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_3 = QGridLayout(self.frame_25) - self.gridLayout_3.setSpacing(0) - self.gridLayout_3.setObjectName("gridLayout_3") - self.gridLayout_3.setContentsMargins(0, 0, 0, 0) - self.label_53 = QLabel(self.frame_25) - self.label_53.setObjectName("label_53") - self.label_53.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_53.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_3.addWidget(self.label_53, 0, 0, 1, 1) - - self.label_connect_status = QLabel(self.frame_25) - self.label_connect_status.setObjectName("label_connect_status") - sizePolicy2.setHeightForWidth( - self.label_connect_status.sizePolicy().hasHeightForWidth() - ) - self.label_connect_status.setSizePolicy(sizePolicy2) - self.label_connect_status.setStyleSheet( - "QLabel {\n" - " background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" - " color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" - " border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" - " border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" - " qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" - "}\n" - "QLabel:disabled{\n" - " background-color: #FD3251; \n" - " color: #ffffff; \n" - " border-radius: 8px; \n" - " border: 1px solid #FD3251; \n" - " qproperty-alignment: 'AlignCenter'; \n" - "}\n" - "" - ) - - self.gridLayout_3.addWidget(self.label_connect_status, 0, 1, 1, 1) - - self.label_8 = QLabel(self.frame_25) - self.label_8.setObjectName("label_8") - self.label_8.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_8.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_3.addWidget(self.label_8, 1, 0, 1, 1) - - self.label_status_model = QLabel(self.frame_25) - self.label_status_model.setObjectName("label_status_model") - sizePolicy2.setHeightForWidth( - self.label_status_model.sizePolicy().hasHeightForWidth() - ) - self.label_status_model.setSizePolicy(sizePolicy2) - self.label_status_model.setStyleSheet( - "QLabel {\n" - " background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" - " color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" - " border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" - " border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" - " qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" - "}\n" - "" - ) - - self.gridLayout_3.addWidget(self.label_status_model, 1, 1, 1, 1) - - self.label_10 = QLabel(self.frame_25) - self.label_10.setObjectName("label_10") - self.label_10.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_10.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_3.addWidget(self.label_10, 2, 0, 1, 1) - - self.label_status_remoteCmdLen = QLabel(self.frame_25) - self.label_status_remoteCmdLen.setObjectName("label_status_remoteCmdLen") - sizePolicy2.setHeightForWidth( - self.label_status_remoteCmdLen.sizePolicy().hasHeightForWidth() - ) - self.label_status_remoteCmdLen.setSizePolicy(sizePolicy2) - self.label_status_remoteCmdLen.setStyleSheet( - "QLabel {\n" - " background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" - " color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" - " border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" - " border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" - " qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" - "}\n" - "" - ) - - self.gridLayout_3.addWidget(self.label_status_remoteCmdLen, 2, 1, 1, 1) - - self.label_13 = QLabel(self.frame_25) - self.label_13.setObjectName("label_13") - self.label_13.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_13.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_3.addWidget(self.label_13, 3, 0, 1, 1) - - self.label_status_speed = QLabel(self.frame_25) - self.label_status_speed.setObjectName("label_status_speed") - sizePolicy2.setHeightForWidth( - self.label_status_speed.sizePolicy().hasHeightForWidth() - ) - self.label_status_speed.setSizePolicy(sizePolicy2) - self.label_status_speed.setStyleSheet( - "QLabel {\n" - " background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" - " color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" - " border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" - " border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" - " qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" - "}\n" - "" - ) - - self.gridLayout_3.addWidget(self.label_status_speed, 3, 1, 1, 1) - - self.label_11 = QLabel(self.frame_25) - self.label_11.setObjectName("label_11") - self.label_11.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_11.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_3.addWidget(self.label_11, 4, 0, 1, 1) - - self.label_status_toolIndex = QLabel(self.frame_25) - self.label_status_toolIndex.setObjectName("label_status_toolIndex") - sizePolicy2.setHeightForWidth( - self.label_status_toolIndex.sizePolicy().hasHeightForWidth() - ) - self.label_status_toolIndex.setSizePolicy(sizePolicy2) - self.label_status_toolIndex.setStyleSheet( - "QLabel {\n" - " background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" - " color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" - " border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" - " border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" - " qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" - "}\n" - "" - ) - - self.gridLayout_3.addWidget(self.label_status_toolIndex, 4, 1, 1, 1) - - self.label_12 = QLabel(self.frame_25) - self.label_12.setObjectName("label_12") - self.label_12.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_12.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_3.addWidget(self.label_12, 5, 0, 1, 1) - - self.label_status_alarmcode = QLabel(self.frame_25) - self.label_status_alarmcode.setObjectName("label_status_alarmcode") - sizePolicy2.setHeightForWidth( - self.label_status_alarmcode.sizePolicy().hasHeightForWidth() - ) - self.label_status_alarmcode.setSizePolicy(sizePolicy2) - self.label_status_alarmcode.setStyleSheet( - "QLabel {\n" - " background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" - " color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" - " border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" - " border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" - " qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" - "}\n" - "" - ) - - self.gridLayout_3.addWidget(self.label_status_alarmcode, 5, 1, 1, 1) - - self.verticalLayout_13.addWidget(self.frame_25) - - self.horizontalLayout_8.addWidget(self.frame_18) - - self.horizontalLayout_8.setStretch(0, 3) - self.horizontalLayout_8.setStretch(1, 2) - - self.verticalLayout_9.addWidget(self.frame_15) - - self.verticalLayout_9.setStretch(0, 3) - self.verticalLayout_9.setStretch(1, 2) - - self.verticalLayout_7.addWidget(self.frame_14) - - self.verticalLayout_7.setStretch(0, 1) - self.stackedWidget_view.addWidget(self.page_3) - self.page_7 = QWidget() - self.page_7.setObjectName("page_7") - self.horizontalLayout_19 = QHBoxLayout(self.page_7) - self.horizontalLayout_19.setSpacing(0) - self.horizontalLayout_19.setObjectName("horizontalLayout_19") - self.horizontalLayout_19.setContentsMargins(0, 0, 0, 0) - self.frame_11 = QFrame(self.page_7) - self.frame_11.setObjectName("frame_11") - self.frame_11.setStyleSheet('font: 700 16pt "Microsoft YaHei UI";') - self.frame_11.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_11.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_8 = QGridLayout(self.frame_11) - self.gridLayout_8.setObjectName("gridLayout_8") - self.gridLayout_8.setVerticalSpacing(40) - self.label_5 = QLabel(self.frame_11) - self.label_5.setObjectName("label_5") - self.label_5.setStyleSheet("color: rgb(255, 255, 255);") - self.label_5.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_5, 0, 0, 1, 1) - - self.widget_y1 = ToggleSwitch(self.frame_11) - self.widget_y1.setObjectName("widget_y1") - self.widget_y1.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y1, 0, 1, 1, 1) - - self.label_57 = QLabel(self.frame_11) - self.label_57.setObjectName("label_57") - self.label_57.setStyleSheet("color: rgb(255, 255, 255);") - self.label_57.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_57, 0, 2, 1, 1) - - self.widget_y2 = ToggleSwitch(self.frame_11) - self.widget_y2.setObjectName("widget_y2") - self.widget_y2.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y2, 0, 3, 1, 1) - - self.label_58 = QLabel(self.frame_11) - self.label_58.setObjectName("label_58") - self.label_58.setStyleSheet("color: rgb(255, 255, 255);") - self.label_58.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_58, 0, 4, 1, 1) - - self.widget_y3 = ToggleSwitch(self.frame_11) - self.widget_y3.setObjectName("widget_y3") - self.widget_y3.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y3, 0, 5, 1, 1) - - self.label_59 = QLabel(self.frame_11) - self.label_59.setObjectName("label_59") - self.label_59.setStyleSheet("color: rgb(255, 255, 255);") - self.label_59.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_59, 0, 6, 1, 1) - - self.widget_y4 = ToggleSwitch(self.frame_11) - self.widget_y4.setObjectName("widget_y4") - self.widget_y4.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y4, 0, 7, 1, 1) - - self.label_7 = QLabel(self.frame_11) - self.label_7.setObjectName("label_7") - self.label_7.setStyleSheet("color: rgb(255, 255, 255);") - self.label_7.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_7, 1, 0, 1, 1) - - self.widget_y5 = ToggleSwitch(self.frame_11) - self.widget_y5.setObjectName("widget_y5") - self.widget_y5.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y5, 1, 1, 1, 1) - - self.label_61 = QLabel(self.frame_11) - self.label_61.setObjectName("label_61") - self.label_61.setStyleSheet("color: rgb(255, 255, 255);") - self.label_61.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_61, 1, 2, 1, 1) - - self.widget_y6 = ToggleSwitch(self.frame_11) - self.widget_y6.setObjectName("widget_y6") - self.widget_y6.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y6, 1, 3, 1, 1) - - self.label_62 = QLabel(self.frame_11) - self.label_62.setObjectName("label_62") - self.label_62.setStyleSheet("color: rgb(255, 255, 255);") - self.label_62.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_62, 1, 4, 1, 1) - - self.widget_y7 = ToggleSwitch(self.frame_11) - self.widget_y7.setObjectName("widget_y7") - self.widget_y7.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y7, 1, 5, 1, 1) - - self.label_60 = QLabel(self.frame_11) - self.label_60.setObjectName("label_60") - self.label_60.setStyleSheet("color: rgb(255, 255, 255);") - self.label_60.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_60, 1, 6, 1, 1) - - self.widget_y8 = ToggleSwitch(self.frame_11) - self.widget_y8.setObjectName("widget_y8") - self.widget_y8.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y8, 1, 7, 1, 1) - - self.label_55 = QLabel(self.frame_11) - self.label_55.setObjectName("label_55") - self.label_55.setStyleSheet("color: rgb(255, 255, 255);") - self.label_55.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_55, 2, 0, 1, 1) - - self.widget_y9 = ToggleSwitch(self.frame_11) - self.widget_y9.setObjectName("widget_y9") - self.widget_y9.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y9, 2, 1, 1, 1) - - self.label_65 = QLabel(self.frame_11) - self.label_65.setObjectName("label_65") - self.label_65.setStyleSheet("color: rgb(255, 255, 255);") - self.label_65.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_65, 2, 2, 1, 1) - - self.widget_y10 = ToggleSwitch(self.frame_11) - self.widget_y10.setObjectName("widget_y10") - self.widget_y10.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y10, 2, 3, 1, 1) - - self.label_64 = QLabel(self.frame_11) - self.label_64.setObjectName("label_64") - self.label_64.setStyleSheet("color: rgb(255, 255, 255);") - self.label_64.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_64, 2, 4, 1, 1) - - self.widget_y11 = ToggleSwitch(self.frame_11) - self.widget_y11.setObjectName("widget_y11") - self.widget_y11.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y11, 2, 5, 1, 1) - - self.label_63 = QLabel(self.frame_11) - self.label_63.setObjectName("label_63") - self.label_63.setStyleSheet("color: rgb(255, 255, 255);") - self.label_63.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_63, 2, 6, 1, 1) - - self.widget_y12 = ToggleSwitch(self.frame_11) - self.widget_y12.setObjectName("widget_y12") - self.widget_y12.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y12, 2, 7, 1, 1) - - self.label_56 = QLabel(self.frame_11) - self.label_56.setObjectName("label_56") - self.label_56.setStyleSheet("color: rgb(255, 255, 255);") - self.label_56.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_56, 3, 0, 1, 1) - - self.widget_y13 = ToggleSwitch(self.frame_11) - self.widget_y13.setObjectName("widget_y13") - self.widget_y13.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y13, 3, 1, 1, 1) - - self.label_68 = QLabel(self.frame_11) - self.label_68.setObjectName("label_68") - self.label_68.setStyleSheet("color: rgb(255, 255, 255);") - self.label_68.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_68, 3, 2, 1, 1) - - self.widget_y14 = ToggleSwitch(self.frame_11) - self.widget_y14.setObjectName("widget_y14") - self.widget_y14.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y14, 3, 3, 1, 1) - - self.label_67 = QLabel(self.frame_11) - self.label_67.setObjectName("label_67") - self.label_67.setStyleSheet("color: rgb(255, 255, 255);") - self.label_67.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_67, 3, 4, 1, 1) - - self.widget_y15 = ToggleSwitch(self.frame_11) - self.widget_y15.setObjectName("widget_y15") - self.widget_y15.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y15, 3, 5, 1, 1) - - self.label_66 = QLabel(self.frame_11) - self.label_66.setObjectName("label_66") - self.label_66.setStyleSheet("color: rgb(255, 255, 255);") - self.label_66.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_66, 3, 6, 1, 1) - - self.widget_y16 = ToggleSwitch(self.frame_11) - self.widget_y16.setObjectName("widget_y16") - self.widget_y16.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y16, 3, 7, 1, 1) - - self.label_69 = QLabel(self.frame_11) - self.label_69.setObjectName("label_69") - self.label_69.setStyleSheet("color: rgb(255, 255, 255);") - self.label_69.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_69, 4, 0, 1, 1) - - self.widget_y17 = ToggleSwitch(self.frame_11) - self.widget_y17.setObjectName("widget_y17") - self.widget_y17.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y17, 4, 1, 1, 1) - - self.label_81 = QLabel(self.frame_11) - self.label_81.setObjectName("label_81") - self.label_81.setStyleSheet("color: rgb(255, 255, 255);") - self.label_81.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_81, 4, 2, 1, 1) - - self.widget_y18 = ToggleSwitch(self.frame_11) - self.widget_y18.setObjectName("widget_y18") - self.widget_y18.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y18, 4, 3, 1, 1) - - self.label_82 = QLabel(self.frame_11) - self.label_82.setObjectName("label_82") - self.label_82.setStyleSheet("color: rgb(255, 255, 255);") - self.label_82.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_82, 4, 4, 1, 1) - - self.widget_y19 = ToggleSwitch(self.frame_11) - self.widget_y19.setObjectName("widget_y19") - self.widget_y19.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y19, 4, 5, 1, 1) - - self.label_78 = QLabel(self.frame_11) - self.label_78.setObjectName("label_78") - self.label_78.setStyleSheet("color: rgb(255, 255, 255);") - self.label_78.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_78, 4, 6, 1, 1) - - self.widget_y20 = ToggleSwitch(self.frame_11) - self.widget_y20.setObjectName("widget_y20") - self.widget_y20.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y20, 4, 7, 1, 1) - - self.label_72 = QLabel(self.frame_11) - self.label_72.setObjectName("label_72") - self.label_72.setStyleSheet("color: rgb(255, 255, 255);") - self.label_72.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_72, 5, 0, 1, 1) - - self.widget_y21 = ToggleSwitch(self.frame_11) - self.widget_y21.setObjectName("widget_y21") - self.widget_y21.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y21, 5, 1, 1, 1) - - self.label_84 = QLabel(self.frame_11) - self.label_84.setObjectName("label_84") - self.label_84.setStyleSheet("color: rgb(255, 255, 255);") - self.label_84.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_84, 5, 2, 1, 1) - - self.widget_y22 = ToggleSwitch(self.frame_11) - self.widget_y22.setObjectName("widget_y22") - self.widget_y22.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y22, 5, 3, 1, 1) - - self.label_77 = QLabel(self.frame_11) - self.label_77.setObjectName("label_77") - self.label_77.setStyleSheet("color: rgb(255, 255, 255);") - self.label_77.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_77, 5, 4, 1, 1) - - self.widget_y23 = ToggleSwitch(self.frame_11) - self.widget_y23.setObjectName("widget_y23") - self.widget_y23.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y23, 5, 5, 1, 1) - - self.label_71 = QLabel(self.frame_11) - self.label_71.setObjectName("label_71") - self.label_71.setStyleSheet("color: rgb(255, 255, 255);") - self.label_71.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_71, 5, 6, 1, 1) - - self.widget_y24 = ToggleSwitch(self.frame_11) - self.widget_y24.setObjectName("widget_y24") - self.widget_y24.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y24, 5, 7, 1, 1) - - self.label_70 = QLabel(self.frame_11) - self.label_70.setObjectName("label_70") - self.label_70.setStyleSheet("color: rgb(255, 255, 255);") - self.label_70.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_70, 6, 0, 1, 1) - - self.widget_y25 = ToggleSwitch(self.frame_11) - self.widget_y25.setObjectName("widget_y25") - self.widget_y25.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y25, 6, 1, 1, 1) - - self.label_80 = QLabel(self.frame_11) - self.label_80.setObjectName("label_80") - self.label_80.setStyleSheet("color: rgb(255, 255, 255);") - self.label_80.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_80, 6, 2, 1, 1) - - self.widget_y26 = ToggleSwitch(self.frame_11) - self.widget_y26.setObjectName("widget_y26") - self.widget_y26.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y26, 6, 3, 1, 1) - - self.label_74 = QLabel(self.frame_11) - self.label_74.setObjectName("label_74") - self.label_74.setStyleSheet("color: rgb(255, 255, 255);") - self.label_74.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_74, 6, 4, 1, 1) - - self.widget_y27 = ToggleSwitch(self.frame_11) - self.widget_y27.setObjectName("widget_y27") - self.widget_y27.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y27, 6, 5, 1, 1) - - self.label_73 = QLabel(self.frame_11) - self.label_73.setObjectName("label_73") - self.label_73.setStyleSheet("color: rgb(255, 255, 255);") - self.label_73.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_73, 6, 6, 1, 1) - - self.widget_y28 = ToggleSwitch(self.frame_11) - self.widget_y28.setObjectName("widget_y28") - self.widget_y28.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y28, 6, 7, 1, 1) - - self.label_75 = QLabel(self.frame_11) - self.label_75.setObjectName("label_75") - self.label_75.setStyleSheet("color: rgb(255, 255, 255);") - self.label_75.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_75, 7, 0, 1, 1) - - self.widget_y29 = ToggleSwitch(self.frame_11) - self.widget_y29.setObjectName("widget_y29") - self.widget_y29.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y29, 7, 1, 1, 1) - - self.label_76 = QLabel(self.frame_11) - self.label_76.setObjectName("label_76") - self.label_76.setStyleSheet("color: rgb(255, 255, 255);") - self.label_76.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_76, 7, 2, 1, 1) - - self.widget_y30 = ToggleSwitch(self.frame_11) - self.widget_y30.setObjectName("widget_y30") - self.widget_y30.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y30, 7, 3, 1, 1) - - self.label_83 = QLabel(self.frame_11) - self.label_83.setObjectName("label_83") - self.label_83.setStyleSheet("color: rgb(255, 255, 255);") - self.label_83.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_83, 7, 4, 1, 1) - - self.widget_y31 = ToggleSwitch(self.frame_11) - self.widget_y31.setObjectName("widget_y31") - self.widget_y31.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y31, 7, 5, 1, 1) - - self.label_79 = QLabel(self.frame_11) - self.label_79.setObjectName("label_79") - self.label_79.setStyleSheet("color: rgb(255, 255, 255);") - self.label_79.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_8.addWidget(self.label_79, 7, 6, 1, 1) - - self.widget_y32 = ToggleSwitch(self.frame_11) - self.widget_y32.setObjectName("widget_y32") - self.widget_y32.setStyleSheet("background-color: rgb(0, 170, 0);") - - self.gridLayout_8.addWidget(self.widget_y32, 7, 7, 1, 1) - - self.horizontalLayout_19.addWidget(self.frame_11) - - self.stackedWidget_view.addWidget(self.page_7) - self.page_4 = QWidget() - self.page_4.setObjectName("page_4") - self.verticalLayout_15 = QVBoxLayout(self.page_4) - self.verticalLayout_15.setSpacing(0) - self.verticalLayout_15.setObjectName("verticalLayout_15") - self.verticalLayout_15.setContentsMargins(0, 0, 0, 0) - self.frame_6 = QFrame(self.page_4) - self.frame_6.setObjectName("frame_6") - self.frame_6.setStyleSheet("border:1px solid #324C82;") - self.frame_6.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_6.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_16 = QVBoxLayout(self.frame_6) - self.verticalLayout_16.setObjectName("verticalLayout_16") - self.frame_27 = QFrame(self.frame_6) - self.frame_27.setObjectName("frame_27") - self.frame_27.setStyleSheet("color:#ffffff;\n" "border:None;") - self.frame_27.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_27.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_9 = QGridLayout(self.frame_27) - self.gridLayout_9.setObjectName("gridLayout_9") - self.gridLayout_9.setVerticalSpacing(80) - self.label_92 = QLabel(self.frame_27) - self.label_92.setObjectName("label_92") - sizePolicy7 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) - sizePolicy7.setHorizontalStretch(0) - sizePolicy7.setVerticalStretch(0) - sizePolicy7.setHeightForWidth(self.label_92.sizePolicy().hasHeightForWidth()) - self.label_92.setSizePolicy(sizePolicy7) - self.label_92.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_92, 1, 2, 1, 1) - - self.lineEdit_origin_y = QLineEdit(self.frame_27) - self.lineEdit_origin_y.setObjectName("lineEdit_origin_y") - sizePolicy4.setHeightForWidth( - self.lineEdit_origin_y.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_origin_y.setSizePolicy(sizePolicy4) - self.lineEdit_origin_y.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_origin_y.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_y, 0, 3, 1, 1) - - self.lineEdit_origin_v = QLineEdit(self.frame_27) - self.lineEdit_origin_v.setObjectName("lineEdit_origin_v") - sizePolicy4.setHeightForWidth( - self.lineEdit_origin_v.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_origin_v.setSizePolicy(sizePolicy4) - self.lineEdit_origin_v.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_origin_v.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_v, 1, 3, 1, 1) - - self.label_88 = QLabel(self.frame_27) - self.label_88.setObjectName("label_88") - sizePolicy7.setHeightForWidth(self.label_88.sizePolicy().hasHeightForWidth()) - self.label_88.setSizePolicy(sizePolicy7) - self.label_88.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_88, 0, 4, 1, 1) - - self.label_93 = QLabel(self.frame_27) - self.label_93.setObjectName("label_93") - sizePolicy7.setHeightForWidth(self.label_93.sizePolicy().hasHeightForWidth()) - self.label_93.setSizePolicy(sizePolicy7) - self.label_93.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_93, 0, 2, 1, 1) - - self.label_95 = QLabel(self.frame_27) - self.label_95.setObjectName("label_95") - sizePolicy7.setHeightForWidth(self.label_95.sizePolicy().hasHeightForWidth()) - self.label_95.setSizePolicy(sizePolicy7) - self.label_95.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_95, 1, 0, 1, 1) - - self.label_90 = QLabel(self.frame_27) - self.label_90.setObjectName("label_90") - sizePolicy7.setHeightForWidth(self.label_90.sizePolicy().hasHeightForWidth()) - self.label_90.setSizePolicy(sizePolicy7) - self.label_90.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_90, 0, 0, 1, 1) - - self.lineEdit_origin_u = QLineEdit(self.frame_27) - self.lineEdit_origin_u.setObjectName("lineEdit_origin_u") - sizePolicy4.setHeightForWidth( - self.lineEdit_origin_u.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_origin_u.setSizePolicy(sizePolicy4) - self.lineEdit_origin_u.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_origin_u.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_u, 1, 1, 1, 1) - - self.lineEdit_origin_x = QLineEdit(self.frame_27) - self.lineEdit_origin_x.setObjectName("lineEdit_origin_x") - sizePolicy4.setHeightForWidth( - self.lineEdit_origin_x.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_origin_x.setSizePolicy(sizePolicy4) - self.lineEdit_origin_x.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_origin_x.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_x, 0, 1, 1, 1) - - self.label_91 = QLabel(self.frame_27) - self.label_91.setObjectName("label_91") - sizePolicy7.setHeightForWidth(self.label_91.sizePolicy().hasHeightForWidth()) - self.label_91.setSizePolicy(sizePolicy7) - self.label_91.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.gridLayout_9.addWidget(self.label_91, 1, 4, 1, 1) - - self.lineEdit_origin_w = QLineEdit(self.frame_27) - self.lineEdit_origin_w.setObjectName("lineEdit_origin_w") - sizePolicy4.setHeightForWidth( - self.lineEdit_origin_w.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_origin_w.setSizePolicy(sizePolicy4) - self.lineEdit_origin_w.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_origin_w.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_w, 1, 5, 1, 1) - - self.lineEdit_origin_z = QLineEdit(self.frame_27) - self.lineEdit_origin_z.setObjectName("lineEdit_origin_z") - sizePolicy4.setHeightForWidth( - self.lineEdit_origin_z.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_origin_z.setSizePolicy(sizePolicy4) - self.lineEdit_origin_z.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_origin_z.setReadOnly(True) - - self.gridLayout_9.addWidget(self.lineEdit_origin_z, 0, 5, 1, 1) - - self.pushButton_get_origin = QPushButton(self.frame_27) - self.pushButton_get_origin.setObjectName("pushButton_get_origin") - sizePolicy4.setHeightForWidth( - self.pushButton_get_origin.sizePolicy().hasHeightForWidth() - ) - self.pushButton_get_origin.setSizePolicy(sizePolicy4) - self.pushButton_get_origin.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: rgb(16, 133, 255);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_9.addWidget(self.pushButton_get_origin, 2, 1, 1, 2) - - self.pushButton_set_origin = QPushButton(self.frame_27) - self.pushButton_set_origin.setObjectName("pushButton_set_origin") - sizePolicy4.setHeightForWidth( - self.pushButton_set_origin.sizePolicy().hasHeightForWidth() - ) - self.pushButton_set_origin.setSizePolicy(sizePolicy4) - self.pushButton_set_origin.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: #1AA094;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_9.addWidget(self.pushButton_set_origin, 2, 4, 1, 2) - - self.gridLayout_9.setRowStretch(0, 1) - self.gridLayout_9.setRowStretch(1, 1) - self.gridLayout_9.setRowStretch(2, 1) - - self.verticalLayout_16.addWidget(self.frame_27) - - self.verticalLayout_15.addWidget(self.frame_6) - - self.frame_26 = QFrame(self.page_4) - self.frame_26.setObjectName("frame_26") - self.frame_26.setStyleSheet("border:1px solid #324C82;") - self.frame_26.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_26.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_16 = QHBoxLayout(self.frame_26) - self.horizontalLayout_16.setObjectName("horizontalLayout_16") - self.horizontalLayout_16.setContentsMargins(-1, 12, -1, -1) - self.frame_28 = QFrame(self.frame_26) - self.frame_28.setObjectName("frame_28") - self.frame_28.setStyleSheet("color:#ffffff;\n" "border:None;") - self.frame_28.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_28.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_5 = QGridLayout(self.frame_28) - self.gridLayout_5.setObjectName("gridLayout_5") - self.gridLayout_5.setVerticalSpacing(35) - self.lineEdit_v5 = QLineEdit(self.frame_28) - self.lineEdit_v5.setObjectName("lineEdit_v5") - sizePolicy1.setHeightForWidth(self.lineEdit_v5.sizePolicy().hasHeightForWidth()) - self.lineEdit_v5.setSizePolicy(sizePolicy1) - self.lineEdit_v5.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_v5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v5, 4, 9, 1, 1) - - self.lineEdit_w5 = QLineEdit(self.frame_28) - self.lineEdit_w5.setObjectName("lineEdit_w5") - sizePolicy1.setHeightForWidth(self.lineEdit_w5.sizePolicy().hasHeightForWidth()) - self.lineEdit_w5.setSizePolicy(sizePolicy1) - self.lineEdit_w5.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_w5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w5, 4, 11, 1, 1) - - self.lineEdit_v1 = QLineEdit(self.frame_28) - self.lineEdit_v1.setObjectName("lineEdit_v1") - sizePolicy1.setHeightForWidth(self.lineEdit_v1.sizePolicy().hasHeightForWidth()) - self.lineEdit_v1.setSizePolicy(sizePolicy1) - self.lineEdit_v1.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_v1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v1, 0, 9, 1, 1) - - self.pushButton_get_p2 = QPushButton(self.frame_28) - self.pushButton_get_p2.setObjectName("pushButton_get_p2") - sizePolicy5.setHeightForWidth( - self.pushButton_get_p2.sizePolicy().hasHeightForWidth() - ) - self.pushButton_get_p2.setSizePolicy(sizePolicy5) - self.pushButton_get_p2.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: rgb(16, 133, 255);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_get_p2, 1, 12, 1, 1) - - self.lineEdit_y2 = QLineEdit(self.frame_28) - self.lineEdit_y2.setObjectName("lineEdit_y2") - sizePolicy1.setHeightForWidth(self.lineEdit_y2.sizePolicy().hasHeightForWidth()) - self.lineEdit_y2.setSizePolicy(sizePolicy1) - self.lineEdit_y2.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_y2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y2, 1, 3, 1, 1) - - self.lineEdit_x1 = QLineEdit(self.frame_28) - self.lineEdit_x1.setObjectName("lineEdit_x1") - sizePolicy1.setHeightForWidth(self.lineEdit_x1.sizePolicy().hasHeightForWidth()) - self.lineEdit_x1.setSizePolicy(sizePolicy1) - self.lineEdit_x1.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_x1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x1, 0, 1, 1, 1) - - self.lineEdit_x2 = QLineEdit(self.frame_28) - self.lineEdit_x2.setObjectName("lineEdit_x2") - sizePolicy1.setHeightForWidth(self.lineEdit_x2.sizePolicy().hasHeightForWidth()) - self.lineEdit_x2.setSizePolicy(sizePolicy1) - self.lineEdit_x2.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_x2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x2, 1, 1, 1, 1) - - self.pushButton_set_p1 = QPushButton(self.frame_28) - self.pushButton_set_p1.setObjectName("pushButton_set_p1") - sizePolicy5.setHeightForWidth( - self.pushButton_set_p1.sizePolicy().hasHeightForWidth() - ) - self.pushButton_set_p1.setSizePolicy(sizePolicy5) - self.pushButton_set_p1.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: #1AA094;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_set_p1, 0, 13, 1, 1) - - self.label_16 = QLabel(self.frame_28) - self.label_16.setObjectName("label_16") - sizePolicy4.setHeightForWidth(self.label_16.sizePolicy().hasHeightForWidth()) - self.label_16.setSizePolicy(sizePolicy4) - self.label_16.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_16, 1, 0, 1, 1) - - self.lineEdit_z5 = QLineEdit(self.frame_28) - self.lineEdit_z5.setObjectName("lineEdit_z5") - sizePolicy1.setHeightForWidth(self.lineEdit_z5.sizePolicy().hasHeightForWidth()) - self.lineEdit_z5.setSizePolicy(sizePolicy1) - self.lineEdit_z5.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_z5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z5, 4, 5, 1, 1) - - self.lineEdit_u5 = QLineEdit(self.frame_28) - self.lineEdit_u5.setObjectName("lineEdit_u5") - sizePolicy1.setHeightForWidth(self.lineEdit_u5.sizePolicy().hasHeightForWidth()) - self.lineEdit_u5.setSizePolicy(sizePolicy1) - self.lineEdit_u5.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_u5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u5, 4, 7, 1, 1) - - self.pushButton_set_p4 = QPushButton(self.frame_28) - self.pushButton_set_p4.setObjectName("pushButton_set_p4") - sizePolicy5.setHeightForWidth( - self.pushButton_set_p4.sizePolicy().hasHeightForWidth() - ) - self.pushButton_set_p4.setSizePolicy(sizePolicy5) - self.pushButton_set_p4.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: #1AA094;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_set_p4, 3, 13, 1, 1) - - self.label_21 = QLabel(self.frame_28) - self.label_21.setObjectName("label_21") - sizePolicy4.setHeightForWidth(self.label_21.sizePolicy().hasHeightForWidth()) - self.label_21.setSizePolicy(sizePolicy4) - self.label_21.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_21, 2, 2, 1, 1) - - self.label_41 = QLabel(self.frame_28) - self.label_41.setObjectName("label_41") - sizePolicy4.setHeightForWidth(self.label_41.sizePolicy().hasHeightForWidth()) - self.label_41.setSizePolicy(sizePolicy4) - self.label_41.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_41, 1, 10, 1, 1) - - self.label_44 = QLabel(self.frame_28) - self.label_44.setObjectName("label_44") - sizePolicy4.setHeightForWidth(self.label_44.sizePolicy().hasHeightForWidth()) - self.label_44.setSizePolicy(sizePolicy4) - self.label_44.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_44, 2, 6, 1, 1) - - self.pushButton_get_p4 = QPushButton(self.frame_28) - self.pushButton_get_p4.setObjectName("pushButton_get_p4") - sizePolicy5.setHeightForWidth( - self.pushButton_get_p4.sizePolicy().hasHeightForWidth() - ) - self.pushButton_get_p4.setSizePolicy(sizePolicy5) - self.pushButton_get_p4.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: rgb(16, 133, 255);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_get_p4, 3, 12, 1, 1) - - self.label_50 = QLabel(self.frame_28) - self.label_50.setObjectName("label_50") - sizePolicy4.setHeightForWidth(self.label_50.sizePolicy().hasHeightForWidth()) - self.label_50.setSizePolicy(sizePolicy4) - self.label_50.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_50, 4, 10, 1, 1) - - self.label_25 = QLabel(self.frame_28) - self.label_25.setObjectName("label_25") - sizePolicy4.setHeightForWidth(self.label_25.sizePolicy().hasHeightForWidth()) - self.label_25.setSizePolicy(sizePolicy4) - self.label_25.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_25, 4, 4, 1, 1) - - self.lineEdit_w1 = QLineEdit(self.frame_28) - self.lineEdit_w1.setObjectName("lineEdit_w1") - sizePolicy1.setHeightForWidth(self.lineEdit_w1.sizePolicy().hasHeightForWidth()) - self.lineEdit_w1.setSizePolicy(sizePolicy1) - self.lineEdit_w1.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_w1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w1, 0, 11, 1, 1) - - self.lineEdit_x5 = QLineEdit(self.frame_28) - self.lineEdit_x5.setObjectName("lineEdit_x5") - sizePolicy1.setHeightForWidth(self.lineEdit_x5.sizePolicy().hasHeightForWidth()) - self.lineEdit_x5.setSizePolicy(sizePolicy1) - self.lineEdit_x5.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_x5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x5, 4, 1, 1, 1) - - self.lineEdit_y5 = QLineEdit(self.frame_28) - self.lineEdit_y5.setObjectName("lineEdit_y5") - sizePolicy1.setHeightForWidth(self.lineEdit_y5.sizePolicy().hasHeightForWidth()) - self.lineEdit_y5.setSizePolicy(sizePolicy1) - self.lineEdit_y5.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_y5.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y5, 4, 3, 1, 1) - - self.lineEdit_w4 = QLineEdit(self.frame_28) - self.lineEdit_w4.setObjectName("lineEdit_w4") - sizePolicy1.setHeightForWidth(self.lineEdit_w4.sizePolicy().hasHeightForWidth()) - self.lineEdit_w4.setSizePolicy(sizePolicy1) - self.lineEdit_w4.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_w4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w4, 3, 11, 1, 1) - - self.label_40 = QLabel(self.frame_28) - self.label_40.setObjectName("label_40") - sizePolicy4.setHeightForWidth(self.label_40.sizePolicy().hasHeightForWidth()) - self.label_40.setSizePolicy(sizePolicy4) - self.label_40.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_40, 1, 8, 1, 1) - - self.label_43 = QLabel(self.frame_28) - self.label_43.setObjectName("label_43") - sizePolicy4.setHeightForWidth(self.label_43.sizePolicy().hasHeightForWidth()) - self.label_43.setSizePolicy(sizePolicy4) - self.label_43.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_43, 2, 10, 1, 1) - - self.lineEdit_v4 = QLineEdit(self.frame_28) - self.lineEdit_v4.setObjectName("lineEdit_v4") - sizePolicy1.setHeightForWidth(self.lineEdit_v4.sizePolicy().hasHeightForWidth()) - self.lineEdit_v4.setSizePolicy(sizePolicy1) - self.lineEdit_v4.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_v4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v4, 3, 9, 1, 1) - - self.lineEdit_u1 = QLineEdit(self.frame_28) - self.lineEdit_u1.setObjectName("lineEdit_u1") - sizePolicy1.setHeightForWidth(self.lineEdit_u1.sizePolicy().hasHeightForWidth()) - self.lineEdit_u1.setSizePolicy(sizePolicy1) - self.lineEdit_u1.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_u1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u1, 0, 7, 1, 1) - - self.lineEdit_y1 = QLineEdit(self.frame_28) - self.lineEdit_y1.setObjectName("lineEdit_y1") - sizePolicy1.setHeightForWidth(self.lineEdit_y1.sizePolicy().hasHeightForWidth()) - self.lineEdit_y1.setSizePolicy(sizePolicy1) - self.lineEdit_y1.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_y1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y1, 0, 3, 1, 1) - - self.label_37 = QLabel(self.frame_28) - self.label_37.setObjectName("label_37") - sizePolicy4.setHeightForWidth(self.label_37.sizePolicy().hasHeightForWidth()) - self.label_37.setSizePolicy(sizePolicy4) - self.label_37.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_37, 0, 10, 1, 1) - - self.lineEdit_w2 = QLineEdit(self.frame_28) - self.lineEdit_w2.setObjectName("lineEdit_w2") - sizePolicy1.setHeightForWidth(self.lineEdit_w2.sizePolicy().hasHeightForWidth()) - self.lineEdit_w2.setSizePolicy(sizePolicy1) - self.lineEdit_w2.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_w2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w2, 1, 11, 1, 1) - - self.pushButton_set_p5 = QPushButton(self.frame_28) - self.pushButton_set_p5.setObjectName("pushButton_set_p5") - sizePolicy5.setHeightForWidth( - self.pushButton_set_p5.sizePolicy().hasHeightForWidth() - ) - self.pushButton_set_p5.setSizePolicy(sizePolicy5) - self.pushButton_set_p5.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: #1AA094;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_set_p5, 4, 13, 1, 1) - - self.pushButton_set_p3 = QPushButton(self.frame_28) - self.pushButton_set_p3.setObjectName("pushButton_set_p3") - sizePolicy5.setHeightForWidth( - self.pushButton_set_p3.sizePolicy().hasHeightForWidth() - ) - self.pushButton_set_p3.setSizePolicy(sizePolicy5) - self.pushButton_set_p3.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: #1AA094;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_set_p3, 2, 13, 1, 1) - - self.label_26 = QLabel(self.frame_28) - self.label_26.setObjectName("label_26") - sizePolicy4.setHeightForWidth(self.label_26.sizePolicy().hasHeightForWidth()) - self.label_26.setSizePolicy(sizePolicy4) - self.label_26.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_26, 4, 2, 1, 1) - - self.label_19 = QLabel(self.frame_28) - self.label_19.setObjectName("label_19") - sizePolicy4.setHeightForWidth(self.label_19.sizePolicy().hasHeightForWidth()) - self.label_19.setSizePolicy(sizePolicy4) - self.label_19.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_19, 2, 0, 1, 1) - - self.lineEdit_y4 = QLineEdit(self.frame_28) - self.lineEdit_y4.setObjectName("lineEdit_y4") - sizePolicy1.setHeightForWidth(self.lineEdit_y4.sizePolicy().hasHeightForWidth()) - self.lineEdit_y4.setSizePolicy(sizePolicy1) - self.lineEdit_y4.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_y4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y4, 3, 3, 1, 1) - - self.label_42 = QLabel(self.frame_28) - self.label_42.setObjectName("label_42") - sizePolicy4.setHeightForWidth(self.label_42.sizePolicy().hasHeightForWidth()) - self.label_42.setSizePolicy(sizePolicy4) - self.label_42.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_42, 2, 8, 1, 1) - - self.lineEdit_u4 = QLineEdit(self.frame_28) - self.lineEdit_u4.setObjectName("lineEdit_u4") - sizePolicy1.setHeightForWidth(self.lineEdit_u4.sizePolicy().hasHeightForWidth()) - self.lineEdit_u4.setSizePolicy(sizePolicy1) - self.lineEdit_u4.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_u4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u4, 3, 7, 1, 1) - - self.lineEdit_z4 = QLineEdit(self.frame_28) - self.lineEdit_z4.setObjectName("lineEdit_z4") - sizePolicy1.setHeightForWidth(self.lineEdit_z4.sizePolicy().hasHeightForWidth()) - self.lineEdit_z4.setSizePolicy(sizePolicy1) - self.lineEdit_z4.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_z4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z4, 3, 5, 1, 1) - - self.lineEdit_x3 = QLineEdit(self.frame_28) - self.lineEdit_x3.setObjectName("lineEdit_x3") - sizePolicy1.setHeightForWidth(self.lineEdit_x3.sizePolicy().hasHeightForWidth()) - self.lineEdit_x3.setSizePolicy(sizePolicy1) - self.lineEdit_x3.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_x3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x3, 2, 1, 1, 1) - - self.label_18 = QLabel(self.frame_28) - self.label_18.setObjectName("label_18") - sizePolicy4.setHeightForWidth(self.label_18.sizePolicy().hasHeightForWidth()) - self.label_18.setSizePolicy(sizePolicy4) - self.label_18.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_18, 1, 2, 1, 1) - - self.label_48 = QLabel(self.frame_28) - self.label_48.setObjectName("label_48") - sizePolicy4.setHeightForWidth(self.label_48.sizePolicy().hasHeightForWidth()) - self.label_48.setSizePolicy(sizePolicy4) - self.label_48.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_48, 4, 8, 1, 1) - - self.label_38 = QLabel(self.frame_28) - self.label_38.setObjectName("label_38") - sizePolicy4.setHeightForWidth(self.label_38.sizePolicy().hasHeightForWidth()) - self.label_38.setSizePolicy(sizePolicy4) - self.label_38.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_38, 0, 8, 1, 1) - - self.lineEdit_y3 = QLineEdit(self.frame_28) - self.lineEdit_y3.setObjectName("lineEdit_y3") - sizePolicy1.setHeightForWidth(self.lineEdit_y3.sizePolicy().hasHeightForWidth()) - self.lineEdit_y3.setSizePolicy(sizePolicy1) - self.lineEdit_y3.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_y3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_y3, 2, 3, 1, 1) - - self.pushButton_get_p5 = QPushButton(self.frame_28) - self.pushButton_get_p5.setObjectName("pushButton_get_p5") - sizePolicy5.setHeightForWidth( - self.pushButton_get_p5.sizePolicy().hasHeightForWidth() - ) - self.pushButton_get_p5.setSizePolicy(sizePolicy5) - self.pushButton_get_p5.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: rgb(16, 133, 255);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_get_p5, 4, 12, 1, 1) - - self.label_20 = QLabel(self.frame_28) - self.label_20.setObjectName("label_20") - sizePolicy4.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth()) - self.label_20.setSizePolicy(sizePolicy4) - self.label_20.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_20, 2, 4, 1, 1) - - self.label_27 = QLabel(self.frame_28) - self.label_27.setObjectName("label_27") - sizePolicy4.setHeightForWidth(self.label_27.sizePolicy().hasHeightForWidth()) - self.label_27.setSizePolicy(sizePolicy4) - self.label_27.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_27, 4, 0, 1, 1) - - self.label_22 = QLabel(self.frame_28) - self.label_22.setObjectName("label_22") - sizePolicy4.setHeightForWidth(self.label_22.sizePolicy().hasHeightForWidth()) - self.label_22.setSizePolicy(sizePolicy4) - self.label_22.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_22, 3, 0, 1, 1) - - self.label_46 = QLabel(self.frame_28) - self.label_46.setObjectName("label_46") - sizePolicy4.setHeightForWidth(self.label_46.sizePolicy().hasHeightForWidth()) - self.label_46.setSizePolicy(sizePolicy4) - self.label_46.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_46, 3, 10, 1, 1) - - self.label_14 = QLabel(self.frame_28) - self.label_14.setObjectName("label_14") - sizePolicy4.setHeightForWidth(self.label_14.sizePolicy().hasHeightForWidth()) - self.label_14.setSizePolicy(sizePolicy4) - self.label_14.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_14, 0, 2, 1, 1) - - self.label_15 = QLabel(self.frame_28) - self.label_15.setObjectName("label_15") - sizePolicy4.setHeightForWidth(self.label_15.sizePolicy().hasHeightForWidth()) - self.label_15.setSizePolicy(sizePolicy4) - self.label_15.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_15, 0, 4, 1, 1) - - self.lineEdit_z3 = QLineEdit(self.frame_28) - self.lineEdit_z3.setObjectName("lineEdit_z3") - sizePolicy1.setHeightForWidth(self.lineEdit_z3.sizePolicy().hasHeightForWidth()) - self.lineEdit_z3.setSizePolicy(sizePolicy1) - self.lineEdit_z3.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_z3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z3, 2, 5, 1, 1) - - self.label_39 = QLabel(self.frame_28) - self.label_39.setObjectName("label_39") - sizePolicy4.setHeightForWidth(self.label_39.sizePolicy().hasHeightForWidth()) - self.label_39.setSizePolicy(sizePolicy4) - self.label_39.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_39, 1, 6, 1, 1) - - self.label_23 = QLabel(self.frame_28) - self.label_23.setObjectName("label_23") - sizePolicy4.setHeightForWidth(self.label_23.sizePolicy().hasHeightForWidth()) - self.label_23.setSizePolicy(sizePolicy4) - self.label_23.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_23, 3, 2, 1, 1) - - self.lineEdit_z2 = QLineEdit(self.frame_28) - self.lineEdit_z2.setObjectName("lineEdit_z2") - sizePolicy1.setHeightForWidth(self.lineEdit_z2.sizePolicy().hasHeightForWidth()) - self.lineEdit_z2.setSizePolicy(sizePolicy1) - self.lineEdit_z2.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_z2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z2, 1, 5, 1, 1) - - self.label_9 = QLabel(self.frame_28) - self.label_9.setObjectName("label_9") - sizePolicy4.setHeightForWidth(self.label_9.sizePolicy().hasHeightForWidth()) - self.label_9.setSizePolicy(sizePolicy4) - self.label_9.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_9, 0, 0, 1, 1) - - self.label_49 = QLabel(self.frame_28) - self.label_49.setObjectName("label_49") - sizePolicy4.setHeightForWidth(self.label_49.sizePolicy().hasHeightForWidth()) - self.label_49.setSizePolicy(sizePolicy4) - self.label_49.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_49, 4, 6, 1, 1) - - self.label_45 = QLabel(self.frame_28) - self.label_45.setObjectName("label_45") - sizePolicy4.setHeightForWidth(self.label_45.sizePolicy().hasHeightForWidth()) - self.label_45.setSizePolicy(sizePolicy4) - self.label_45.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_45, 3, 6, 1, 1) - - self.pushButton_get_p3 = QPushButton(self.frame_28) - self.pushButton_get_p3.setObjectName("pushButton_get_p3") - sizePolicy5.setHeightForWidth( - self.pushButton_get_p3.sizePolicy().hasHeightForWidth() - ) - self.pushButton_get_p3.setSizePolicy(sizePolicy5) - self.pushButton_get_p3.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: rgb(16, 133, 255);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_get_p3, 2, 12, 1, 1) - - self.lineEdit_v3 = QLineEdit(self.frame_28) - self.lineEdit_v3.setObjectName("lineEdit_v3") - sizePolicy1.setHeightForWidth(self.lineEdit_v3.sizePolicy().hasHeightForWidth()) - self.lineEdit_v3.setSizePolicy(sizePolicy1) - self.lineEdit_v3.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_v3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v3, 2, 9, 1, 1) - - self.lineEdit_x4 = QLineEdit(self.frame_28) - self.lineEdit_x4.setObjectName("lineEdit_x4") - sizePolicy1.setHeightForWidth(self.lineEdit_x4.sizePolicy().hasHeightForWidth()) - self.lineEdit_x4.setSizePolicy(sizePolicy1) - self.lineEdit_x4.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_x4.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_x4, 3, 1, 1, 1) - - self.label_47 = QLabel(self.frame_28) - self.label_47.setObjectName("label_47") - sizePolicy4.setHeightForWidth(self.label_47.sizePolicy().hasHeightForWidth()) - self.label_47.setSizePolicy(sizePolicy4) - self.label_47.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_47, 3, 8, 1, 1) - - self.pushButton_get_p1 = QPushButton(self.frame_28) - self.pushButton_get_p1.setObjectName("pushButton_get_p1") - sizePolicy5.setHeightForWidth( - self.pushButton_get_p1.sizePolicy().hasHeightForWidth() - ) - self.pushButton_get_p1.setSizePolicy(sizePolicy5) - self.pushButton_get_p1.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: rgb(16, 133, 255);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_get_p1, 0, 12, 1, 1) - - self.lineEdit_u2 = QLineEdit(self.frame_28) - self.lineEdit_u2.setObjectName("lineEdit_u2") - sizePolicy1.setHeightForWidth(self.lineEdit_u2.sizePolicy().hasHeightForWidth()) - self.lineEdit_u2.setSizePolicy(sizePolicy1) - self.lineEdit_u2.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_u2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u2, 1, 7, 1, 1) - - self.lineEdit_z1 = QLineEdit(self.frame_28) - self.lineEdit_z1.setObjectName("lineEdit_z1") - sizePolicy1.setHeightForWidth(self.lineEdit_z1.sizePolicy().hasHeightForWidth()) - self.lineEdit_z1.setSizePolicy(sizePolicy1) - self.lineEdit_z1.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_z1.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_z1, 0, 5, 1, 1) - - self.pushButton_set_p2 = QPushButton(self.frame_28) - self.pushButton_set_p2.setObjectName("pushButton_set_p2") - sizePolicy5.setHeightForWidth( - self.pushButton_set_p2.sizePolicy().hasHeightForWidth() - ) - self.pushButton_set_p2.setSizePolicy(sizePolicy5) - self.pushButton_set_p2.setStyleSheet( - "\n" - "*{\n" - "color: #ffffff;\n" - "background-color: #1AA094;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 6px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #197971;\n" - "}\n" - "" - ) - - self.gridLayout_5.addWidget(self.pushButton_set_p2, 1, 13, 1, 1) - - self.label_24 = QLabel(self.frame_28) - self.label_24.setObjectName("label_24") - sizePolicy4.setHeightForWidth(self.label_24.sizePolicy().hasHeightForWidth()) - self.label_24.setSizePolicy(sizePolicy4) - self.label_24.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_24, 3, 4, 1, 1) - - self.lineEdit_w3 = QLineEdit(self.frame_28) - self.lineEdit_w3.setObjectName("lineEdit_w3") - sizePolicy1.setHeightForWidth(self.lineEdit_w3.sizePolicy().hasHeightForWidth()) - self.lineEdit_w3.setSizePolicy(sizePolicy1) - self.lineEdit_w3.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_w3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_w3, 2, 11, 1, 1) - - self.lineEdit_u3 = QLineEdit(self.frame_28) - self.lineEdit_u3.setObjectName("lineEdit_u3") - sizePolicy1.setHeightForWidth(self.lineEdit_u3.sizePolicy().hasHeightForWidth()) - self.lineEdit_u3.setSizePolicy(sizePolicy1) - self.lineEdit_u3.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_u3.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_u3, 2, 7, 1, 1) - - self.label_36 = QLabel(self.frame_28) - self.label_36.setObjectName("label_36") - sizePolicy4.setHeightForWidth(self.label_36.sizePolicy().hasHeightForWidth()) - self.label_36.setSizePolicy(sizePolicy4) - self.label_36.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_36, 0, 6, 1, 1) - - self.label_17 = QLabel(self.frame_28) - self.label_17.setObjectName("label_17") - sizePolicy4.setHeightForWidth(self.label_17.sizePolicy().hasHeightForWidth()) - self.label_17.setSizePolicy(sizePolicy4) - self.label_17.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.gridLayout_5.addWidget(self.label_17, 1, 4, 1, 1) - - self.lineEdit_v2 = QLineEdit(self.frame_28) - self.lineEdit_v2.setObjectName("lineEdit_v2") - sizePolicy1.setHeightForWidth(self.lineEdit_v2.sizePolicy().hasHeightForWidth()) - self.lineEdit_v2.setSizePolicy(sizePolicy1) - self.lineEdit_v2.setStyleSheet("border:1px solid #FFFfff") - self.lineEdit_v2.setReadOnly(True) - - self.gridLayout_5.addWidget(self.lineEdit_v2, 1, 9, 1, 1) - - self.gridLayout_5.setRowStretch(0, 1) - self.gridLayout_5.setRowStretch(1, 1) - self.gridLayout_5.setRowStretch(2, 1) - self.gridLayout_5.setRowStretch(3, 1) - self.gridLayout_5.setRowStretch(4, 1) - self.gridLayout_5.setColumnStretch(0, 1) - self.gridLayout_5.setColumnStretch(1, 2) - self.gridLayout_5.setColumnStretch(2, 1) - self.gridLayout_5.setColumnStretch(3, 2) - self.gridLayout_5.setColumnStretch(4, 1) - self.gridLayout_5.setColumnStretch(5, 2) - self.gridLayout_5.setColumnStretch(6, 1) - self.gridLayout_5.setColumnStretch(7, 2) - self.gridLayout_5.setColumnStretch(8, 1) - self.gridLayout_5.setColumnStretch(9, 2) - self.gridLayout_5.setColumnStretch(10, 1) - self.gridLayout_5.setColumnStretch(11, 2) - self.gridLayout_5.setColumnStretch(12, 3) - self.gridLayout_5.setColumnStretch(13, 4) - - self.horizontalLayout_16.addWidget(self.frame_28) - - self.verticalLayout_15.addWidget(self.frame_26) - - self.verticalLayout_15.setStretch(0, 1) - self.verticalLayout_15.setStretch(1, 1) - self.stackedWidget_view.addWidget(self.page_4) - self.page = QWidget() - self.page.setObjectName("page") - self.verticalLayout_17 = QVBoxLayout(self.page) - self.verticalLayout_17.setSpacing(0) - self.verticalLayout_17.setObjectName("verticalLayout_17") - self.verticalLayout_17.setContentsMargins(0, 0, 0, 0) - self.frame_8 = QFrame(self.page) - self.frame_8.setObjectName("frame_8") - self.frame_8.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_8.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_18 = QVBoxLayout(self.frame_8) - self.verticalLayout_18.setObjectName("verticalLayout_18") - self.lineEdit_setting_height1 = QFrame(self.frame_8) - self.lineEdit_setting_height1.setObjectName("lineEdit_setting_height1") - sizePolicy8 = QSizePolicy( - QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum - ) - sizePolicy8.setHorizontalStretch(0) - sizePolicy8.setVerticalStretch(0) - sizePolicy8.setHeightForWidth( - self.lineEdit_setting_height1.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_setting_height1.setSizePolicy(sizePolicy8) - self.lineEdit_setting_height1.setFrameShape(QFrame.Shape.StyledPanel) - self.lineEdit_setting_height1.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_6 = QGridLayout(self.lineEdit_setting_height1) - self.gridLayout_6.setObjectName("gridLayout_6") - self.gridLayout_6.setHorizontalSpacing(0) - self.gridLayout_6.setVerticalSpacing(60) - self.gridLayout_6.setContentsMargins(0, 0, 0, 60) - self.pushButton_saveSeting = QPushButton(self.lineEdit_setting_height1) - self.pushButton_saveSeting.setObjectName("pushButton_saveSeting") - sizePolicy1.setHeightForWidth( - self.pushButton_saveSeting.sizePolicy().hasHeightForWidth() - ) - self.pushButton_saveSeting.setSizePolicy(sizePolicy1) - self.pushButton_saveSeting.setStyleSheet( - "*{\n" - "background-color: #2196F3;\n" - 'font: 20pt "\u6977\u4f53";\n' - "border:None;\n" - "color:#ffffff\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - self.pushButton_saveSeting.setFlat(False) - - self.gridLayout_6.addWidget(self.pushButton_saveSeting, 6, 0, 1, 4) - - self.lineEdit_speed_debug = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_speed_debug.setObjectName("lineEdit_speed_debug") - sizePolicy1.setHeightForWidth( - self.lineEdit_speed_debug.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_speed_debug.setSizePolicy(sizePolicy1) - self.lineEdit_speed_debug.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_speed_debug, 2, 1, 1, 1) - - self.label_51 = QLabel(self.lineEdit_setting_height1) - self.label_51.setObjectName("label_51") - sizePolicy4.setHeightForWidth(self.label_51.sizePolicy().hasHeightForWidth()) - self.label_51.setSizePolicy(sizePolicy4) - self.label_51.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_51, 0, 2, 1, 1) - - self.lineEdit_press_addr = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_press_addr.setObjectName("lineEdit_press_addr") - sizePolicy1.setHeightForWidth( - self.lineEdit_press_addr.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_press_addr.setSizePolicy(sizePolicy1) - self.lineEdit_press_addr.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_press_addr, 1, 3, 1, 1) - - self.label_54 = QLabel(self.lineEdit_setting_height1) - self.label_54.setObjectName("label_54") - sizePolicy4.setHeightForWidth(self.label_54.sizePolicy().hasHeightForWidth()) - self.label_54.setSizePolicy(sizePolicy4) - self.label_54.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_54, 2, 2, 1, 1) - - self.lineEdit_speed_run = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_speed_run.setObjectName("lineEdit_speed_run") - sizePolicy1.setHeightForWidth( - self.lineEdit_speed_run.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_speed_run.setSizePolicy(sizePolicy1) - self.lineEdit_speed_run.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_speed_run, 0, 1, 1, 1) - - self.lineEdit_speed_reset = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_speed_reset.setObjectName("lineEdit_speed_reset") - sizePolicy1.setHeightForWidth( - self.lineEdit_speed_reset.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_speed_reset.setSizePolicy(sizePolicy1) - self.lineEdit_speed_reset.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_speed_reset, 1, 1, 1, 1) - - self.lineEdit_shake_addr = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_shake_addr.setObjectName("lineEdit_shake_addr") - sizePolicy1.setHeightForWidth( - self.lineEdit_shake_addr.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_shake_addr.setSizePolicy(sizePolicy1) - self.lineEdit_shake_addr.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_shake_addr, 2, 3, 1, 1) - - self.lineEdit_timedelay_put = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_timedelay_put.setObjectName("lineEdit_timedelay_put") - sizePolicy1.setHeightForWidth( - self.lineEdit_timedelay_put.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_timedelay_put.setSizePolicy(sizePolicy1) - self.lineEdit_timedelay_put.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_timedelay_put, 4, 1, 1, 1) - - self.label_85 = QLabel(self.lineEdit_setting_height1) - self.label_85.setObjectName("label_85") - sizePolicy4.setHeightForWidth(self.label_85.sizePolicy().hasHeightForWidth()) - self.label_85.setSizePolicy(sizePolicy4) - self.label_85.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_85, 3, 2, 1, 1) - - self.label_94 = QLabel(self.lineEdit_setting_height1) - self.label_94.setObjectName("label_94") - sizePolicy4.setHeightForWidth(self.label_94.sizePolicy().hasHeightForWidth()) - self.label_94.setSizePolicy(sizePolicy4) - self.label_94.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_94, 1, 0, 1, 1) - - self.lineEdit_timedelay_shake = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_timedelay_shake.setObjectName("lineEdit_timedelay_shake") - sizePolicy1.setHeightForWidth( - self.lineEdit_timedelay_shake.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_timedelay_shake.setSizePolicy(sizePolicy1) - self.lineEdit_timedelay_shake.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_timedelay_shake, 3, 3, 1, 1) - - self.label_28 = QLabel(self.lineEdit_setting_height1) - self.label_28.setObjectName("label_28") - sizePolicy4.setHeightForWidth(self.label_28.sizePolicy().hasHeightForWidth()) - self.label_28.setSizePolicy(sizePolicy4) - self.label_28.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_28, 0, 0, 1, 1) - - self.lineEdit_setting_smooth = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_setting_smooth.setObjectName("lineEdit_setting_smooth") - sizePolicy1.setHeightForWidth( - self.lineEdit_setting_smooth.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_setting_smooth.setSizePolicy(sizePolicy1) - self.lineEdit_setting_smooth.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_setting_smooth, 4, 3, 1, 1) - - self.lineEdit_timedelay_take = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_timedelay_take.setObjectName("lineEdit_timedelay_take") - sizePolicy1.setHeightForWidth( - self.lineEdit_timedelay_take.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_timedelay_take.setSizePolicy(sizePolicy1) - self.lineEdit_timedelay_take.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_timedelay_take, 3, 1, 1, 1) - - self.lineEdit_setting_height = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_setting_height.setObjectName("lineEdit_setting_height") - sizePolicy1.setHeightForWidth( - self.lineEdit_setting_height.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_setting_height.setSizePolicy(sizePolicy1) - self.lineEdit_setting_height.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_setting_height, 5, 1, 1, 1) - - self.label_29 = QLabel(self.lineEdit_setting_height1) - self.label_29.setObjectName("label_29") - sizePolicy4.setHeightForWidth(self.label_29.sizePolicy().hasHeightForWidth()) - self.label_29.setSizePolicy(sizePolicy4) - self.label_29.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_29, 2, 0, 1, 1) - - self.label_87 = QLabel(self.lineEdit_setting_height1) - self.label_87.setObjectName("label_87") - sizePolicy4.setHeightForWidth(self.label_87.sizePolicy().hasHeightForWidth()) - self.label_87.setSizePolicy(sizePolicy4) - self.label_87.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_87, 3, 0, 1, 1) - - self.lineEdit_take_addr = QLineEdit(self.lineEdit_setting_height1) - self.lineEdit_take_addr.setObjectName("lineEdit_take_addr") - sizePolicy1.setHeightForWidth( - self.lineEdit_take_addr.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_take_addr.setSizePolicy(sizePolicy1) - self.lineEdit_take_addr.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.lineEdit_take_addr, 0, 3, 1, 1) - - self.label_52 = QLabel(self.lineEdit_setting_height1) - self.label_52.setObjectName("label_52") - sizePolicy4.setHeightForWidth(self.label_52.sizePolicy().hasHeightForWidth()) - self.label_52.setSizePolicy(sizePolicy4) - self.label_52.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_52, 1, 2, 1, 1) - - self.label_89 = QLabel(self.lineEdit_setting_height1) - self.label_89.setObjectName("label_89") - sizePolicy4.setHeightForWidth(self.label_89.sizePolicy().hasHeightForWidth()) - self.label_89.setSizePolicy(sizePolicy4) - self.label_89.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_89, 4, 2, 1, 1) - - self.label_86 = QLabel(self.lineEdit_setting_height1) - self.label_86.setObjectName("label_86") - sizePolicy4.setHeightForWidth(self.label_86.sizePolicy().hasHeightForWidth()) - self.label_86.setSizePolicy(sizePolicy4) - self.label_86.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_86, 4, 0, 1, 1) - - self.label_96 = QLabel(self.lineEdit_setting_height1) - self.label_96.setObjectName("label_96") - sizePolicy4.setHeightForWidth(self.label_96.sizePolicy().hasHeightForWidth()) - self.label_96.setSizePolicy(sizePolicy4) - self.label_96.setStyleSheet("color: rgb(255, 255, 255);") - - self.gridLayout_6.addWidget(self.label_96, 5, 0, 1, 1) - - self.gridLayout_6.setRowStretch(0, 1) - self.gridLayout_6.setRowStretch(1, 1) - self.gridLayout_6.setRowStretch(2, 1) - self.gridLayout_6.setRowStretch(3, 1) - self.gridLayout_6.setRowStretch(4, 1) - self.gridLayout_6.setRowStretch(5, 1) - self.gridLayout_6.setRowStretch(6, 1) - - self.verticalLayout_18.addWidget(self.lineEdit_setting_height1) - - self.verticalLayout_18.setStretch(0, 7) - - self.verticalLayout_17.addWidget(self.frame_8) - - self.stackedWidget_view.addWidget(self.page) - self.page_2 = QWidget() - self.page_2.setObjectName("page_2") - self.verticalLayout_19 = QVBoxLayout(self.page_2) - self.verticalLayout_19.setSpacing(0) - self.verticalLayout_19.setObjectName("verticalLayout_19") - self.verticalLayout_19.setContentsMargins(0, 0, 0, 0) - self.frame_30 = QFrame(self.page_2) - self.frame_30.setObjectName("frame_30") - self.frame_30.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_30.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_17 = QHBoxLayout(self.frame_30) - self.horizontalLayout_17.setSpacing(0) - self.horizontalLayout_17.setObjectName("horizontalLayout_17") - self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0) - self.frame_31 = QFrame(self.frame_30) - self.frame_31.setObjectName("frame_31") - self.frame_31.setStyleSheet("background-color: rgb(85, 170, 255);") - self.frame_31.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_31.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_7 = QGridLayout(self.frame_31) - self.gridLayout_7.setObjectName("gridLayout_7") - self.lineEdit_j6 = QLineEdit(self.frame_31) - self.lineEdit_j6.setObjectName("lineEdit_j6") - - self.gridLayout_7.addWidget(self.lineEdit_j6, 14, 7, 1, 1) - - self.pushButton_j3_add = QPushButton(self.frame_31) - self.pushButton_j3_add.setObjectName("pushButton_j3_add") - self.pushButton_j3_add.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color:rgb(85, 85, 255);\n" - "}\n" - "" - ) - icon6 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListAdd)) - self.pushButton_j3_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j3_add, 8, 6, 1, 1) - - self.lineEdit_j2 = QLineEdit(self.frame_31) - self.lineEdit_j2.setObjectName("lineEdit_j2") - - self.gridLayout_7.addWidget(self.lineEdit_j2, 6, 7, 1, 1) - - self.horizontalSlider_J3 = QSlider(self.frame_31) - self.horizontalSlider_J3.setObjectName("horizontalSlider_J3") - self.horizontalSlider_J3.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J3, 8, 2, 1, 4) - - self.pushButton_j5_add = QPushButton(self.frame_31) - self.pushButton_j5_add.setObjectName("pushButton_j5_add") - self.pushButton_j5_add.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color:rgb(85, 85, 255);\n" - "}\n" - "" - ) - self.pushButton_j5_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j5_add, 12, 6, 1, 1) - - self.pushButton_j6_sub = QPushButton(self.frame_31) - self.pushButton_j6_sub.setObjectName("pushButton_j6_sub") - self.pushButton_j6_sub.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color: rgb(255, 0, 0);\n" - "}\n" - "" - ) - icon7 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListRemove)) - self.pushButton_j6_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j6_sub, 14, 1, 1, 1) - - self.label_34 = QLabel(self.frame_31) - self.label_34.setObjectName("label_34") - self.label_34.setStyleSheet('font: 700 9pt "Microsoft YaHei UI";') - - self.gridLayout_7.addWidget(self.label_34, 12, 0, 1, 1) - - self.pushButton_j6_add = QPushButton(self.frame_31) - self.pushButton_j6_add.setObjectName("pushButton_j6_add") - self.pushButton_j6_add.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color:rgb(85, 85, 255);\n" - "}\n" - "" - ) - self.pushButton_j6_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j6_add, 14, 6, 1, 1) - - self.label_j5_max = QLabel(self.frame_31) - self.label_j5_max.setObjectName("label_j5_max") - - self.gridLayout_7.addWidget(self.label_j5_max, 11, 5, 1, 1) - - self.lineEdit_j4 = QLineEdit(self.frame_31) - self.lineEdit_j4.setObjectName("lineEdit_j4") - - self.gridLayout_7.addWidget(self.lineEdit_j4, 10, 7, 1, 1) - - self.pushButton_j2_add = QPushButton(self.frame_31) - self.pushButton_j2_add.setObjectName("pushButton_j2_add") - self.pushButton_j2_add.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color:rgb(85, 85, 255);\n" - "}\n" - "" - ) - self.pushButton_j2_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j2_add, 6, 6, 1, 1) - - self.lineEdit_j3 = QLineEdit(self.frame_31) - self.lineEdit_j3.setObjectName("lineEdit_j3") - - self.gridLayout_7.addWidget(self.lineEdit_j3, 8, 7, 1, 1) - - self.horizontalSlider_J1 = QSlider(self.frame_31) - self.horizontalSlider_J1.setObjectName("horizontalSlider_J1") - self.horizontalSlider_J1.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J1, 4, 2, 1, 4) - - self.label_j1 = QLabel(self.frame_31) - self.label_j1.setObjectName("label_j1") - - self.gridLayout_7.addWidget(self.label_j1, 3, 4, 1, 1) - - self.label_j2_min = QLabel(self.frame_31) - self.label_j2_min.setObjectName("label_j2_min") - - self.gridLayout_7.addWidget(self.label_j2_min, 5, 2, 1, 2) - - self.lineEdit_j5 = QLineEdit(self.frame_31) - self.lineEdit_j5.setObjectName("lineEdit_j5") - - self.gridLayout_7.addWidget(self.lineEdit_j5, 12, 7, 1, 1) - - self.label_j5_min = QLabel(self.frame_31) - self.label_j5_min.setObjectName("label_j5_min") - - self.gridLayout_7.addWidget(self.label_j5_min, 11, 2, 1, 2) - - self.label_30 = QLabel(self.frame_31) - self.label_30.setObjectName("label_30") - self.label_30.setStyleSheet('font: 700 9pt "Microsoft YaHei UI";') - - self.gridLayout_7.addWidget(self.label_30, 4, 0, 1, 1) - - self.label_j6_min = QLabel(self.frame_31) - self.label_j6_min.setObjectName("label_j6_min") - - self.gridLayout_7.addWidget(self.label_j6_min, 13, 2, 1, 2) - - self.label_j3_min = QLabel(self.frame_31) - self.label_j3_min.setObjectName("label_j3_min") - - self.gridLayout_7.addWidget(self.label_j3_min, 7, 2, 1, 2) - - self.horizontalSlider_J4 = QSlider(self.frame_31) - self.horizontalSlider_J4.setObjectName("horizontalSlider_J4") - self.horizontalSlider_J4.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J4, 10, 2, 1, 4) - - self.label_j3_max = QLabel(self.frame_31) - self.label_j3_max.setObjectName("label_j3_max") - - self.gridLayout_7.addWidget(self.label_j3_max, 7, 5, 1, 1) - - self.pushButton_j3_sub = QPushButton(self.frame_31) - self.pushButton_j3_sub.setObjectName("pushButton_j3_sub") - self.pushButton_j3_sub.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color: rgb(255, 0, 0);\n" - "}\n" - "" - ) - self.pushButton_j3_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j3_sub, 8, 1, 1, 1) - - self.pushButton_j4_sub = QPushButton(self.frame_31) - self.pushButton_j4_sub.setObjectName("pushButton_j4_sub") - self.pushButton_j4_sub.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color: rgb(255, 0, 0);\n" - "}\n" - "" - ) - self.pushButton_j4_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j4_sub, 10, 1, 1, 1) - - self.pushButton_j1_add = QPushButton(self.frame_31) - self.pushButton_j1_add.setObjectName("pushButton_j1_add") - self.pushButton_j1_add.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color:rgb(0, 255, 0);\n" - "}\n" - "" - ) - self.pushButton_j1_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j1_add, 4, 6, 1, 1) - - self.label_j4_min = QLabel(self.frame_31) - self.label_j4_min.setObjectName("label_j4_min") - - self.gridLayout_7.addWidget(self.label_j4_min, 9, 2, 1, 2) - - self.pushButton_j1_sub = QPushButton(self.frame_31) - self.pushButton_j1_sub.setObjectName("pushButton_j1_sub") - self.pushButton_j1_sub.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color: rgb(255, 0, 0);\n" - "}\n" - "" - ) - self.pushButton_j1_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j1_sub, 4, 1, 1, 1) - - self.pushButton_sendMove = QPushButton(self.frame_31) - self.pushButton_sendMove.setObjectName("pushButton_sendMove") - self.pushButton_sendMove.setStyleSheet( - "*{\n" - "background-color: #007AD9;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border:6px solid #55AAFF;\n" - "color:#ffffff\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - - self.gridLayout_7.addWidget(self.pushButton_sendMove, 15, 0, 1, 8) - - self.horizontalSlider_J2 = QSlider(self.frame_31) - self.horizontalSlider_J2.setObjectName("horizontalSlider_J2") - self.horizontalSlider_J2.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J2, 6, 2, 1, 4) - - self.horizontalSlider_J5 = QSlider(self.frame_31) - self.horizontalSlider_J5.setObjectName("horizontalSlider_J5") - self.horizontalSlider_J5.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J5, 12, 2, 1, 4) - - self.label_j1_max = QLabel(self.frame_31) - self.label_j1_max.setObjectName("label_j1_max") - - self.gridLayout_7.addWidget(self.label_j1_max, 3, 5, 1, 1) - - self.label_j3 = QLabel(self.frame_31) - self.label_j3.setObjectName("label_j3") - - self.gridLayout_7.addWidget(self.label_j3, 7, 4, 1, 1) - - self.pushButton_j5_sub = QPushButton(self.frame_31) - self.pushButton_j5_sub.setObjectName("pushButton_j5_sub") - self.pushButton_j5_sub.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color: rgb(255, 0, 0);\n" - "}\n" - "" - ) - self.pushButton_j5_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j5_sub, 12, 1, 1, 1) - - self.label_j6_max = QLabel(self.frame_31) - self.label_j6_max.setObjectName("label_j6_max") - - self.gridLayout_7.addWidget(self.label_j6_max, 13, 5, 1, 1) - - self.label_j5 = QLabel(self.frame_31) - self.label_j5.setObjectName("label_j5") - - self.gridLayout_7.addWidget(self.label_j5, 11, 4, 1, 1) - - self.label_35 = QLabel(self.frame_31) - self.label_35.setObjectName("label_35") - self.label_35.setStyleSheet('font: 700 9pt "Microsoft YaHei UI";') - - self.gridLayout_7.addWidget(self.label_35, 14, 0, 1, 1) - - self.lineEdit_j1 = QLineEdit(self.frame_31) - self.lineEdit_j1.setObjectName("lineEdit_j1") - - self.gridLayout_7.addWidget(self.lineEdit_j1, 4, 7, 1, 1) - - self.label_j2_max = QLabel(self.frame_31) - self.label_j2_max.setObjectName("label_j2_max") - - self.gridLayout_7.addWidget(self.label_j2_max, 5, 5, 1, 1) - - self.label_32 = QLabel(self.frame_31) - self.label_32.setObjectName("label_32") - self.label_32.setStyleSheet('font: 700 9pt "Microsoft YaHei UI";') - - self.gridLayout_7.addWidget(self.label_32, 8, 0, 1, 1) - - self.pushButton_j4_add = QPushButton(self.frame_31) - self.pushButton_j4_add.setObjectName("pushButton_j4_add") - self.pushButton_j4_add.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color:rgb(85, 85, 255);\n" - "}\n" - "" - ) - self.pushButton_j4_add.setIcon(icon6) - - self.gridLayout_7.addWidget(self.pushButton_j4_add, 10, 6, 1, 1) - - self.label_j6 = QLabel(self.frame_31) - self.label_j6.setObjectName("label_j6") - - self.gridLayout_7.addWidget(self.label_j6, 13, 4, 1, 1) - - self.label_j1_min = QLabel(self.frame_31) - self.label_j1_min.setObjectName("label_j1_min") - - self.gridLayout_7.addWidget(self.label_j1_min, 3, 2, 1, 1) - - self.label_j4 = QLabel(self.frame_31) - self.label_j4.setObjectName("label_j4") - - self.gridLayout_7.addWidget(self.label_j4, 9, 4, 1, 1) - - self.pushButton_j2_sub = QPushButton(self.frame_31) - self.pushButton_j2_sub.setObjectName("pushButton_j2_sub") - self.pushButton_j2_sub.setStyleSheet( - "*{\n" - "background-color: #E7EAEA;\n" - "border-radius: 10px;\n" - 'font: 10pt "\u6977\u4f53";\n' - "}\n" - "*:hover{\n" - " background-color: rgb(85, 85, 255);\n" - "}\n" - "*:pressed{\n" - " background-color: rgb(255, 0, 0);\n" - "}\n" - "" - ) - self.pushButton_j2_sub.setIcon(icon7) - - self.gridLayout_7.addWidget(self.pushButton_j2_sub, 6, 1, 1, 1) - - self.label_j2 = QLabel(self.frame_31) - self.label_j2.setObjectName("label_j2") - - self.gridLayout_7.addWidget(self.label_j2, 5, 4, 1, 1) - - self.label_31 = QLabel(self.frame_31) - self.label_31.setObjectName("label_31") - self.label_31.setStyleSheet('font: 700 9pt "Microsoft YaHei UI";') - - self.gridLayout_7.addWidget(self.label_31, 6, 0, 1, 1) - - self.label_manual_adjust_accuracy = QLabel(self.frame_31) - self.label_manual_adjust_accuracy.setObjectName("label_manual_adjust_accuracy") - - self.gridLayout_7.addWidget(self.label_manual_adjust_accuracy, 0, 2, 1, 1) - - self.label_j4_max = QLabel(self.frame_31) - self.label_j4_max.setObjectName("label_j4_max") - - self.gridLayout_7.addWidget(self.label_j4_max, 9, 5, 1, 1) - - self.label_33 = QLabel(self.frame_31) - self.label_33.setObjectName("label_33") - self.label_33.setStyleSheet('font: 700 9pt "Microsoft YaHei UI";') - - self.gridLayout_7.addWidget(self.label_33, 10, 0, 1, 1) - - self.horizontalSlider_J6 = QSlider(self.frame_31) - self.horizontalSlider_J6.setObjectName("horizontalSlider_J6") - self.horizontalSlider_J6.setOrientation(Qt.Orientation.Horizontal) - - self.gridLayout_7.addWidget(self.horizontalSlider_J6, 14, 2, 1, 4) - - self.lineEdit_manual_adjust_accuracy = QLineEdit(self.frame_31) - self.lineEdit_manual_adjust_accuracy.setObjectName( - "lineEdit_manual_adjust_accuracy" - ) - - self.gridLayout_7.addWidget(self.lineEdit_manual_adjust_accuracy, 0, 3, 1, 1) - - self.gridLayout_7.setColumnStretch(0, 1) - self.gridLayout_7.setColumnStretch(1, 1) - self.gridLayout_7.setColumnStretch(2, 1) - self.gridLayout_7.setColumnStretch(3, 6) - self.gridLayout_7.setColumnStretch(4, 1) - self.gridLayout_7.setColumnStretch(5, 1) - self.gridLayout_7.setColumnStretch(6, 1) - self.gridLayout_7.setColumnStretch(7, 2) - - self.horizontalLayout_17.addWidget(self.frame_31) - - self.verticalLayout_19.addWidget(self.frame_30) - - self.stackedWidget_view.addWidget(self.page_2) - self.page_8 = QWidget() - self.page_8.setObjectName("page_8") - self.verticalLayout_22 = QVBoxLayout(self.page_8) - self.verticalLayout_22.setSpacing(0) - self.verticalLayout_22.setObjectName("verticalLayout_22") - self.verticalLayout_22.setContentsMargins(0, 0, 0, 0) - self.frame_16 = QFrame(self.page_8) - self.frame_16.setObjectName("frame_16") - self.frame_16.setStyleSheet("color: rgb(255, 255, 255);") - self.frame_16.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_16.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_23 = QVBoxLayout(self.frame_16) - self.verticalLayout_23.setObjectName("verticalLayout_23") - self.pushButton_savePosition = QPushButton(self.frame_16) - self.pushButton_savePosition.setObjectName("pushButton_savePosition") - self.pushButton_savePosition.setStyleSheet( - "color: rgb(255, 255, 255);\n" "background-color: rgb(0, 85, 0);" - ) - - self.verticalLayout_23.addWidget(self.pushButton_savePosition) - - self.label_table_line_title = QLabel(self.frame_16) - self.label_table_line_title.setObjectName("label_table_line_title") - self.label_table_line_title.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.verticalLayout_23.addWidget(self.label_table_line_title) - - self.tableWidget_lines = QTableWidget(self.frame_16) - self.tableWidget_lines.setObjectName("tableWidget_lines") - self.tableWidget_lines.setStyleSheet( - " QHeaderView::section {\n" - " background-color: #2C2C2C; /* \u8868\u5934\u80cc\u666f\u8272 */\n" - " color: white; /* \u8868\u5934\u5b57\u4f53\u989c\u8272 */\n" - " font-size: 14px; /* \u5b57\u4f53\u5927\u5c0f */\n" - " font-weight: bold; /* \u5b57\u4f53\u52a0\u7c97 */\n" - " border: 1px solid black; /* \u8fb9\u6846\u989c\u8272 */\n" - " padding: 4px; /* \u5185\u8fb9\u8ddd */\n" - " }" - ) - - self.verticalLayout_23.addWidget(self.tableWidget_lines) - - self.label_table_line_position_title = QLabel(self.frame_16) - self.label_table_line_position_title.setObjectName( - "label_table_line_position_title" - ) - self.label_table_line_position_title.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.verticalLayout_23.addWidget(self.label_table_line_position_title) - - self.tableWidget_line_positions = QTableWidget(self.frame_16) - self.tableWidget_line_positions.setObjectName("tableWidget_line_positions") - self.tableWidget_line_positions.setStyleSheet( - " QHeaderView::section {\n" - " background-color: #2C2C2C; /* \u8868\u5934\u80cc\u666f\u8272 */\n" - " color: white; /* \u8868\u5934\u5b57\u4f53\u989c\u8272 */\n" - " font-size: 14px; /* \u5b57\u4f53\u5927\u5c0f */\n" - " font-weight: bold; /* \u5b57\u4f53\u52a0\u7c97 */\n" - " border: 1px solid black; /* \u8fb9\u6846\u989c\u8272 */\n" - " padding: 4px; /* \u5185\u8fb9\u8ddd */\n" - " }" - ) - - self.verticalLayout_23.addWidget(self.tableWidget_line_positions) - - self.verticalLayout_22.addWidget(self.frame_16) - - self.stackedWidget_view.addWidget(self.page_8) - - self.verticalLayout_8.addWidget(self.stackedWidget_view) - - self.horizontalLayout_4.addWidget(self.frame_view) - - self.frame_right = QFrame(self.frame_main) - self.frame_right.setObjectName("frame_right") - sizePolicy1.setHeightForWidth(self.frame_right.sizePolicy().hasHeightForWidth()) - self.frame_right.setSizePolicy(sizePolicy1) - self.frame_right.setStyleSheet( - "background-color: rgb(16, 21, 49);\n" "border: 1px solid #122041;" - ) - self.frame_right.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_right.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_10 = QVBoxLayout(self.frame_right) - self.verticalLayout_10.setSpacing(0) - self.verticalLayout_10.setObjectName("verticalLayout_10") - self.verticalLayout_10.setContentsMargins(0, 0, 0, 0) - self.frame_19 = QFrame(self.frame_right) - self.frame_19.setObjectName("frame_19") - self.frame_19.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_19.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_10 = QHBoxLayout(self.frame_19) - self.horizontalLayout_10.setObjectName("horizontalLayout_10") - self.label_3 = QLabel(self.frame_19) - self.label_3.setObjectName("label_3") - self.label_3.setStyleSheet("border-image: url(:/main/Image/calendar.svg);") - self.label_3.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_10.addWidget(self.label_3) - - self.label_date = QLabel(self.frame_19) - self.label_date.setObjectName("label_date") - self.label_date.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - self.label_date.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_10.addWidget(self.label_date) - - self.label_time = QLabel(self.frame_19) - self.label_time.setObjectName("label_time") - self.label_time.setStyleSheet( - "color:#fff;\n" - 'font: 290 9pt "Microsoft YaHei";\n' - 'font: 700 9pt "Microsoft YaHei UI";' - ) - - self.horizontalLayout_10.addWidget(self.label_time) - - self.horizontalLayout_10.setStretch(0, 1) - self.horizontalLayout_10.setStretch(1, 5) - self.horizontalLayout_10.setStretch(2, 5) - - self.verticalLayout_10.addWidget(self.frame_19) - - self.frame_20 = QFrame(self.frame_right) - self.frame_20.setObjectName("frame_20") - self.frame_20.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_20.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_11 = QVBoxLayout(self.frame_20) - self.verticalLayout_11.setObjectName("verticalLayout_11") - self.comboBox_lineIndex = QComboBox(self.frame_20) - self.comboBox_lineIndex.addItem("") - self.comboBox_lineIndex.addItem("") - self.comboBox_lineIndex.setObjectName("comboBox_lineIndex") - self.comboBox_lineIndex.setStyleSheet( - "QComboBox {\n" - " border-radius: 10px;\n" - " padding: 5px 5px 5px 5px;\n" - " background-color: #2c2c2c;\n" - " color: white;\n" - " border: 1px solid #474747;\n" - " min-width: 80px;\n" - "}\n" - "\n" - "\n" - "QComboBox::drop-down {\n" - " width: 0px;\n" - " border: none;\n" - "\n" - "}\n" - "\n" - "QComboBox::down-arrow {\n" - " image: none;\n" - "}\n" - "\n" - "QComboBox QAbstractItemView {\n" - " border-bottom-right-radius: 10px;\n" - " border-bottom-left-radius: 10px;\n" - " background-color: #D3D3D3;\n" - " border: 1px solid gray;\n" - " padding: 4px 4px 4px 4px;\n" - " outline: none;\n" - "}" - ) - - self.verticalLayout_11.addWidget(self.comboBox_lineIndex) - - self.stackedWidget_num = QStackedWidget(self.frame_20) - self.stackedWidget_num.setObjectName("stackedWidget_num") - self.stackedWidget_num.setStyleSheet("border:none;") - self.page_5 = QWidget() - self.page_5.setObjectName("page_5") - self.horizontalLayout_18 = QHBoxLayout(self.page_5) - self.horizontalLayout_18.setSpacing(0) - self.horizontalLayout_18.setObjectName("horizontalLayout_18") - self.horizontalLayout_18.setContentsMargins(0, 0, 0, 0) - self.frame_23 = QFrame(self.page_5) - self.frame_23.setObjectName("frame_23") - self.frame_23.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_23.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout = QGridLayout(self.frame_23) - self.gridLayout.setObjectName("gridLayout") - self.pushButton_num1 = QPushButton(self.frame_23) - self.pushButton_num1.setObjectName("pushButton_num1") - sizePolicy1.setHeightForWidth( - self.pushButton_num1.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num1.setSizePolicy(sizePolicy1) - self.pushButton_num1.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num1, 0, 0, 1, 1) - - self.pushButton_num2 = QPushButton(self.frame_23) - self.pushButton_num2.setObjectName("pushButton_num2") - sizePolicy1.setHeightForWidth( - self.pushButton_num2.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num2.setSizePolicy(sizePolicy1) - self.pushButton_num2.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num2, 0, 1, 1, 1) - - self.pushButton_num3 = QPushButton(self.frame_23) - self.pushButton_num3.setObjectName("pushButton_num3") - sizePolicy1.setHeightForWidth( - self.pushButton_num3.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num3.setSizePolicy(sizePolicy1) - self.pushButton_num3.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num3, 0, 2, 1, 1) - - self.pushButton_num4 = QPushButton(self.frame_23) - self.pushButton_num4.setObjectName("pushButton_num4") - sizePolicy1.setHeightForWidth( - self.pushButton_num4.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num4.setSizePolicy(sizePolicy1) - self.pushButton_num4.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num4, 1, 0, 1, 1) - - self.pushButton_num5 = QPushButton(self.frame_23) - self.pushButton_num5.setObjectName("pushButton_num5") - sizePolicy1.setHeightForWidth( - self.pushButton_num5.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num5.setSizePolicy(sizePolicy1) - self.pushButton_num5.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num5, 1, 1, 1, 1) - - self.pushButton_num6 = QPushButton(self.frame_23) - self.pushButton_num6.setObjectName("pushButton_num6") - sizePolicy1.setHeightForWidth( - self.pushButton_num6.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num6.setSizePolicy(sizePolicy1) - self.pushButton_num6.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num6, 1, 2, 1, 1) - - self.lineEdit_num = QLineEdit(self.frame_23) - self.lineEdit_num.setObjectName("lineEdit_num") - sizePolicy1.setHeightForWidth( - self.lineEdit_num.sizePolicy().hasHeightForWidth() - ) - self.lineEdit_num.setSizePolicy(sizePolicy1) - self.lineEdit_num.setStyleSheet( - "color: rgb(255, 255, 255);\n" - "border: 1px solid #dcdfe6;\n" - 'font: 8pt "Microsoft YaHei UI";' - ) - - self.gridLayout.addWidget(self.lineEdit_num, 2, 0, 1, 1) - - self.pushButton_num_confirm = QPushButton(self.frame_23) - self.pushButton_num_confirm.setObjectName("pushButton_num_confirm") - sizePolicy1.setHeightForWidth( - self.pushButton_num_confirm.sizePolicy().hasHeightForWidth() - ) - self.pushButton_num_confirm.setSizePolicy(sizePolicy1) - self.pushButton_num_confirm.setStyleSheet( - "\n" - "*{background-color: #101F3F;\n" - 'font: 10pt "\u6977\u4f53";\n' - "color:#ffffff\n" - "}\n" - "*:hover {\n" - " background-color: lightgreen;\n" - " color: black;\n" - "}*:pressed {\n" - " background-color: red;\n" - " color: white;\n" - " }" - ) - - self.gridLayout.addWidget(self.pushButton_num_confirm, 2, 1, 1, 2) - - self.gridLayout.setColumnStretch(0, 1) - self.gridLayout.setColumnStretch(1, 1) - self.gridLayout.setColumnStretch(2, 1) - - self.horizontalLayout_18.addWidget(self.frame_23) - - self.stackedWidget_num.addWidget(self.page_5) - self.page_6 = QWidget() - self.page_6.setObjectName("page_6") - self.verticalLayout_20 = QVBoxLayout(self.page_6) - self.verticalLayout_20.setSpacing(0) - self.verticalLayout_20.setObjectName("verticalLayout_20") - self.verticalLayout_20.setContentsMargins(0, 0, 0, 0) - self.frame_32 = QFrame(self.page_6) - self.frame_32.setObjectName("frame_32") - self.frame_32.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_32.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_21 = QVBoxLayout(self.frame_32) - self.verticalLayout_21.setObjectName("verticalLayout_21") - self.pushButton_AddNum = QPushButton(self.frame_32) - self.pushButton_AddNum.setObjectName("pushButton_AddNum") - sizePolicy5.setHeightForWidth( - self.pushButton_AddNum.sizePolicy().hasHeightForWidth() - ) - self.pushButton_AddNum.setSizePolicy(sizePolicy5) - self.pushButton_AddNum.setStyleSheet( - "*{\n" - "background-color: #499C54;\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - self.pushButton_AddNum.setIcon(icon6) - - self.verticalLayout_21.addWidget(self.pushButton_AddNum) - - self.pushButton_SubNum = QPushButton(self.frame_32) - self.pushButton_SubNum.setObjectName("pushButton_SubNum") - sizePolicy5.setHeightForWidth( - self.pushButton_SubNum.sizePolicy().hasHeightForWidth() - ) - self.pushButton_SubNum.setSizePolicy(sizePolicy5) - self.pushButton_SubNum.setStyleSheet( - "*{\n" - "background-color: rgb(255, 0, 0);\n" - 'font: 12pt "\u6977\u4f53";\n' - "border: 1px solid #dcdfe6;\n" - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - self.pushButton_SubNum.setIcon(icon7) - - self.verticalLayout_21.addWidget(self.pushButton_SubNum) - - self.verticalLayout_20.addWidget(self.frame_32) - - self.stackedWidget_num.addWidget(self.page_6) - - self.verticalLayout_11.addWidget(self.stackedWidget_num) - - self.verticalLayout_10.addWidget(self.frame_20) - - self.frame_21 = QFrame(self.frame_right) - self.frame_21.setObjectName("frame_21") - sizePolicy4.setHeightForWidth(self.frame_21.sizePolicy().hasHeightForWidth()) - self.frame_21.setSizePolicy(sizePolicy4) - self.frame_21.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_21.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_2 = QGridLayout(self.frame_21) - self.gridLayout_2.setObjectName("gridLayout_2") - self.pushButton_reset = QPushButton(self.frame_21) - self.pushButton_reset.setObjectName("pushButton_reset") - self.pushButton_reset.setVisible(False) # 8/18 隐藏复位 - sizePolicy5.setHeightForWidth( - self.pushButton_reset.sizePolicy().hasHeightForWidth() - ) - self.pushButton_reset.setSizePolicy(sizePolicy5) - self.pushButton_reset.setStyleSheet( - "*{\n" - "background-color: #FFFFBF;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #FFF000;\n" - "}\n" - "" - ) - icon8 = QIcon(QIcon.fromTheme("media-optical")) - self.pushButton_reset.setIcon(icon8) - - self.gridLayout_2.addWidget(self.pushButton_reset, 2, 1, 1, 2) - - self.pushButton_emergency = QPushButton(self.frame_21) - self.pushButton_emergency.setObjectName("pushButton_emergency") - sizePolicy5.setHeightForWidth( - self.pushButton_emergency.sizePolicy().hasHeightForWidth() - ) - self.pushButton_emergency.setSizePolicy(sizePolicy5) - self.pushButton_emergency.setStyleSheet( - "*{\n" - "background-color: #FFF000;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #ff6e00;\n" - "}\n" - "\n" - "" - ) - icon9 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.WindowClose)) - self.pushButton_emergency.setIcon(icon9) - - self.gridLayout_2.addWidget(self.pushButton_emergency, 3, 0, 1, 1) - - self.pushButton_stopFeed = QPushButton(self.frame_21) - self.pushButton_stopFeed.setObjectName("pushButton_stopFeed") - sizePolicy5.setHeightForWidth( - self.pushButton_stopFeed.sizePolicy().hasHeightForWidth() - ) - self.pushButton_stopFeed.setSizePolicy(sizePolicy5) - self.pushButton_stopFeed.setStyleSheet( - "*{\n" - "background-color: #FF0000;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - icon10 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemShutdown)) - self.pushButton_stopFeed.setIcon(icon10) - - self.gridLayout_2.addWidget(self.pushButton_stopFeed, 2, 0, 1, 1) - - self.pushButton_pauseFeed = QPushButton(self.frame_21) - self.pushButton_pauseFeed.setObjectName("pushButton_pauseFeed") - sizePolicy5.setHeightForWidth( - self.pushButton_pauseFeed.sizePolicy().hasHeightForWidth() - ) - self.pushButton_pauseFeed.setVisible(False) # 8/18 隐藏暂停 - self.pushButton_pauseFeed.setSizePolicy(sizePolicy5) - self.pushButton_pauseFeed.setStyleSheet( - "*{\n" - "background-color: #2196F3;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - icon11 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause)) - self.pushButton_pauseFeed.setIcon(icon11) - - self.gridLayout_2.addWidget(self.pushButton_pauseFeed, 1, 1, 1, 2) - - self.pushButton_startFeed = QPushButton(self.frame_21) - self.pushButton_startFeed.setObjectName("pushButton_startFeed") - sizePolicy5.setHeightForWidth( - self.pushButton_startFeed.sizePolicy().hasHeightForWidth() - ) - self.pushButton_startFeed.setSizePolicy(sizePolicy5) - self.pushButton_startFeed.setStyleSheet( - "*{\n" - "background-color: #499C54;\n" - 'font: 9pt "\u6977\u4f53";\n' - "\n" - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color: #499c8a;\n" - "}\n" - "" - ) - icon12 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart)) - self.pushButton_startFeed.setIcon(icon12) - - self.gridLayout_2.addWidget(self.pushButton_startFeed, 1, 0, 1, 1) - - self.pushButton_clearAlarm = QPushButton(self.frame_21) - self.pushButton_clearAlarm.setObjectName("pushButton_clearAlarm") - sizePolicy5.setHeightForWidth( - self.pushButton_clearAlarm.sizePolicy().hasHeightForWidth() - ) - self.pushButton_clearAlarm.setSizePolicy(sizePolicy5) - self.pushButton_clearAlarm.setStyleSheet( - "*{\n" - "background-color: #1CB2B1;\n" - 'font: 9pt "\u6977\u4f53";\n' - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color:#1cb052;\n" - "}\n" - "\n" - "" - ) - icon13 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot)) - self.pushButton_clearAlarm.setIcon(icon13) - - self.pushButton_clearAlarm.setVisible(False) # 8/18 隐藏 清除警报 - - self.gridLayout_2.addWidget(self.pushButton_clearAlarm, 3, 1, 1, 2) - - self.pushButton_onekeyfeed = QPushButton(self.frame_21) - self.pushButton_onekeyfeed.setObjectName("pushButton_onekeyfeed") - sizePolicy5.setHeightForWidth( - self.pushButton_onekeyfeed.sizePolicy().hasHeightForWidth() - ) - self.pushButton_onekeyfeed.setSizePolicy(sizePolicy5) - self.pushButton_onekeyfeed.setStyleSheet( - "*{\n" - "background-color: rgb(0, 170, 0);\n" - "\n" - 'font: 9pt "\u6977\u4f53";\n' - "border-radius: 10px;\n" - "}\n" - "*:pressed\n" - "{\n" - "background-color:#1cb052;\n" - "}\n" - "\n" - "" - ) - icon14 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentSend)) - self.pushButton_onekeyfeed.setIcon(icon14) - self.pushButton_onekeyfeed.setIconSize(QSize(20, 20)) - - self.gridLayout_2.addWidget(self.pushButton_onekeyfeed, 0, 0, 1, 2) - - self.gridLayout_2.setRowStretch(0, 2) - self.gridLayout_2.setRowStretch(1, 2) - self.gridLayout_2.setRowStretch(2, 2) - self.gridLayout_2.setRowStretch(3, 2) - self.gridLayout_2.setColumnStretch(0, 1) - # 8/18 第一列不分配空间(将第一列隐藏之后设置, 只保留启动,停止,急停) - self.gridLayout_2.setColumnStretch(1, 0) - # self.gridLayout_2.setColumnStretch(1, 1) # 这里和上面只能存在一个 - self.gridLayout_2.setRowMinimumHeight(0, 2) - self.gridLayout_2.setRowMinimumHeight(1, 2) - self.gridLayout_2.setRowMinimumHeight(2, 2) - - self.verticalLayout_10.addWidget(self.frame_21) - - self.frame_22 = QFrame(self.frame_right) - self.frame_22.setObjectName("frame_22") - self.frame_22.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_22.setFrameShadow(QFrame.Shadow.Raised) - self.verticalLayout_12 = QVBoxLayout(self.frame_22) - self.verticalLayout_12.setObjectName("verticalLayout_12") - self.horizontalSlider_feedingNum = QSlider(self.frame_22) - self.horizontalSlider_feedingNum.setObjectName("horizontalSlider_feedingNum") - self.horizontalSlider_feedingNum.setStyleSheet( - "/**QSlider\n" - "{\n" - " background-color: #FFFFFF; \n" - " border-style: outset; \n" - " border-radius:5px; \n" - "}\n" - " \n" - "QSlider::groove:horizontal\n" - "{\n" - " height: 10px;\n" - " background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);\n" - " margin: 10px 0\n" - "}\n" - " \n" - "QSlider::handle:horizontal \n" - "{\n" - " background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green);\n" - " width: 10px;\n" - " height: 16px;\n" - " margin: -5px 3px -5px 6px;\n" - " border-radius:5px; \n" - " border: 3px solid #007900;\n" - "}\n" - "**/\n" - "/*\u7b2c\u4e00\u79cd\u98ce\u683c*/\n" - "/**\n" - " groove\u8868\u793a\u69fd\u7684\u90e8\u5206\n" - " handle\u8868\u793a\u6ed1\u5757\n" - " add-page\u8868\u793a\u672a\u6ed1\u8fc7\u7684\u69fd\u90e8\u5206\n" - " sub-page\u8868\u793a\u5df2\u6ed1\u8fc7\u7684\u69fd\u90e8\u5206\n" - " \u5728\u8f85\u52a9\u63a7\u5236\u5668\u540e\u9762\u53ef\u4ee5\u8bbe\u7f6e\u72b6\u6001\uff0chorizontal\u5c31\u662fQSS\u751f\u6548\u7684QSlider\u7684\u72b6\u6001\n" - "*" - "*/\n" - "\n" - "QSlider::groove:horizontal\n" - "{\n" - " height:10px;\n" - " border-radius: 5px;\n" - " background-color:rgb(219,219,219);\n" - "}\n" - "\n" - "\n" - "QSlider::handle:horizontal \n" - "{\n" - " background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green);\n" - " width: 5px;\n" - " height: 5px;\n" - " margin: -5px 3px -5px 6px;\n" - " border-radius:5px; \n" - " border: 3px solid #007900;\n" - "}\n" - "\n" - "QSlider::add-page:horizontal\n" - "{\n" - " border-radius: 5px;\n" - " background-color: rgb(219,219,219);\n" - "}\n" - " \n" - "QSlider::sub-page:horizontal\n" - "{\n" - " border-radius: 5px;\n" - " background-color: rgb(80,166,234);\n" - "}\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "" - ) - self.horizontalSlider_feedingNum.setOrientation(Qt.Orientation.Horizontal) - - self.verticalLayout_12.addWidget(self.horizontalSlider_feedingNum) - - self.frame_7 = QFrame(self.frame_22) - self.frame_7.setObjectName("frame_7") - self.frame_7.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_7.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_11 = QHBoxLayout(self.frame_7) - self.horizontalLayout_11.setObjectName("horizontalLayout_11") - self.label_4 = QLabel(self.frame_7) - self.label_4.setObjectName("label_4") - self.label_4.setStyleSheet("color: rgb(255, 255, 255);") - self.label_4.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.horizontalLayout_11.addWidget(self.label_4) - - self.label_maxNum = QLabel(self.frame_7) - self.label_maxNum.setObjectName("label_maxNum") - self.label_maxNum.setStyleSheet( - "color: rgb(255, 0, 0);\n" 'font: 36pt "Microsoft YaHei UI";' - ) - self.label_maxNum.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_11.addWidget(self.label_maxNum) - - self.horizontalLayout_11.setStretch(0, 1) - self.horizontalLayout_11.setStretch(1, 5) - - self.verticalLayout_12.addWidget(self.frame_7) - - self.frame_24 = QFrame(self.frame_22) - self.frame_24.setObjectName("frame_24") - self.frame_24.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_24.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalLayout_12 = QHBoxLayout(self.frame_24) - self.horizontalLayout_12.setObjectName("horizontalLayout_12") - self.label_6 = QLabel(self.frame_24) - self.label_6.setObjectName("label_6") - self.label_6.setStyleSheet("color: rgb(255, 255, 255);") - self.label_6.setAlignment( - Qt.AlignmentFlag.AlignRight - | Qt.AlignmentFlag.AlignTrailing - | Qt.AlignmentFlag.AlignVCenter - ) - - self.horizontalLayout_12.addWidget(self.label_6) - - self.label_remain_num = QLabel(self.frame_24) - self.label_remain_num.setObjectName("label_remain_num") - self.label_remain_num.setStyleSheet( - "color: rgb(0, 255, 0);\n" 'font: 36pt "Microsoft YaHei UI";' - ) - self.label_remain_num.setAlignment(Qt.AlignmentFlag.AlignCenter) - - self.horizontalLayout_12.addWidget(self.label_remain_num) - - self.horizontalLayout_12.setStretch(0, 1) - self.horizontalLayout_12.setStretch(1, 5) - - self.verticalLayout_12.addWidget(self.frame_24) - - self.verticalLayout_10.addWidget(self.frame_22) - - self.verticalLayout_10.setStretch(0, 1) - self.verticalLayout_10.setStretch(1, 6) - self.verticalLayout_10.setStretch(2, 6) - self.verticalLayout_10.setStretch(3, 1) - - self.horizontalLayout_4.addWidget(self.frame_right) - - self.horizontalLayout_4.setStretch(0, 45) - self.horizontalLayout_4.setStretch(1, 137) - self.horizontalLayout_4.setStretch(2, 59) - - self.verticalLayout.addWidget(self.frame_main) - - self.verticalLayout.setStretch(0, 1) - self.verticalLayout.setStretch(1, 11) - MainWindow.setCentralWidget(self.centralwidget) - - self.retranslateUi(MainWindow) - - self.stackedWidget_view.setCurrentIndex(0) - self.tabWidget.setCurrentIndex(0) - self.stackedWidget_num.setCurrentIndex(0) - - QMetaObject.connectSlotsByName(MainWindow) - - # setupUi - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle( - QCoreApplication.translate("MainWindow", "\u5bc6\u80fa", None) - ) - self.label.setText("") - self.label_2.setText( - QCoreApplication.translate("MainWindow", "爱来米业码垛系统", None) - ) - self.pushButton.setText( - QCoreApplication.translate("MainWindow", "\u6295\u6599\u4e2d\u5fc3", None) - ) - self.pushButton_2.setText( - QCoreApplication.translate("MainWindow", "\u634f\u5408\u4e2d\u5fc3", None) - ) - self.pushButton_3.setText( - QCoreApplication.translate("MainWindow", "\u6210\u54c1", None) - ) - self.pushButton_4.setText( - QCoreApplication.translate("MainWindow", "\u63a7\u5236\u4e2d\u5fc3", None) - ) - self.pushButton_5.setText( - QCoreApplication.translate("MainWindow", "\u767b\u5f55", None) - ) - self.pushButton_exit.setText( - QCoreApplication.translate("MainWindow", "\u9000\u51fa", None) - ) - self.pushButton_sysseting.setText( - QCoreApplication.translate("MainWindow", "\u7cfb\u7edf\u8bbe\u7f6e", None) - ) - self.pushButton_leftmenu_produce.setText( - QCoreApplication.translate("MainWindow", "\u751f\u4ea7\u754c\u9762", None) - ) - self.pushButton_leftmenu_robot_seting.setText( - QCoreApplication.translate( - "MainWindow", "\u673a\u68b0\u81c2\u57fa\u7840\u8bbe\u7f6e", None - ) - ) - self.pushButton_leftmenu_IO.setText( - QCoreApplication.translate("MainWindow", "IO\u9762\u677f", None) - ) - self.pushButton_leftmenu_position.setText( - QCoreApplication.translate("MainWindow", "\u4f4d\u7f6e\u8bbe\u5b9a", None) - ) - self.pushButton_leftmenu_baseSeting.setText( - QCoreApplication.translate("MainWindow", "\u57fa\u7840\u8bbe\u7f6e", None) - ) - self.pushButton_leftmenu_posDebug.setText( - QCoreApplication.translate("MainWindow", "\u70b9\u4f4d\u8c03\u8bd5", None) - ) - self.pushButton_11.setText( - QCoreApplication.translate("MainWindow", "\u5176\u4ed6\u8bbe\u7f6e", None) - ) - self.pushButton_sign_go.setText("") - self.label_sign_go.setText( - QCoreApplication.translate("MainWindow", "\u53d6\u6599\u4e2d...", None) - ) - self.pushButton_sign_photo.setText("") - self.label_sign_photo.setText( - QCoreApplication.translate("MainWindow", "\u62cd\u7167\u4e2d...", None) - ) - self.pushButton_sign_take.setText("") - self.label_sign_take.setText( - QCoreApplication.translate("MainWindow", "\u6293\u6599\u4e2d...", None) - ) - self.pushButton_sign_feed.setText("") - self.label_sign_feed.setText( - QCoreApplication.translate("MainWindow", "\u6295\u6599\u4e2d...", None) - ) - self.label_showDetection.setText("") - self.label_move_sign.setText( - QCoreApplication.translate("MainWindow", "\u6b63\u5728\u79fb\u52a8", None) - ) - self.tabWidget.setTabText( - self.tabWidget.indexOf(self.tab), - QCoreApplication.translate("MainWindow", "\u65e5\u5fd7", None), - ) - self.tabWidget.setTabText( - self.tabWidget.indexOf(self.tab_2), - QCoreApplication.translate("MainWindow", "\u62a5\u8b66", None), - ) - self.label_53.setText( - QCoreApplication.translate( - "MainWindow", "\u8fde\u63a5\u72b6\u6001\uff1a", None - ) - ) - self.label_connect_status.setText("") - self.label_8.setText( - QCoreApplication.translate( - "MainWindow", "\u5f53\u524d\u6a21\u5f0f\uff1a", None - ) - ) - self.label_status_model.setText( - QCoreApplication.translate("MainWindow", "\u81ea\u52a8", None) - ) - self.label_10.setText( - QCoreApplication.translate( - "MainWindow", "\u8fdc\u7a0b\u6307\u4ee4\u6570\u91cf\uff1a", None - ) - ) - self.label_status_remoteCmdLen.setText( - QCoreApplication.translate("MainWindow", "0", None) - ) - self.label_13.setText( - QCoreApplication.translate( - "MainWindow", "\u5f53\u524d\u901f\u5ea6\uff1a", None - ) - ) - self.label_status_speed.setText( - QCoreApplication.translate("MainWindow", "0", None) - ) - self.label_11.setText( - QCoreApplication.translate( - "MainWindow", "\u5f53\u524d\u5de5\u5177\u53f7\uff1a", None - ) - ) - self.label_status_toolIndex.setText( - QCoreApplication.translate("MainWindow", "1", None) - ) - self.label_12.setText( - QCoreApplication.translate( - "MainWindow", "\u62a5\u8b66\u4ee3\u7801\uff1a", None - ) - ) - self.label_status_alarmcode.setText( - QCoreApplication.translate("MainWindow", "200", None) - ) - self.label_5.setText(QCoreApplication.translate("MainWindow", "Y1", None)) - self.label_57.setText(QCoreApplication.translate("MainWindow", "2", None)) - self.label_58.setText(QCoreApplication.translate("MainWindow", "3", None)) - self.label_59.setText(QCoreApplication.translate("MainWindow", "4", None)) - self.label_7.setText(QCoreApplication.translate("MainWindow", "5", None)) - self.label_61.setText(QCoreApplication.translate("MainWindow", "6", None)) - self.label_62.setText(QCoreApplication.translate("MainWindow", "7", None)) - self.label_60.setText(QCoreApplication.translate("MainWindow", "8", None)) - self.label_55.setText(QCoreApplication.translate("MainWindow", "9", None)) - self.label_65.setText(QCoreApplication.translate("MainWindow", "10", None)) - self.label_64.setText(QCoreApplication.translate("MainWindow", "11", None)) - self.label_63.setText(QCoreApplication.translate("MainWindow", "12", None)) - self.label_56.setText(QCoreApplication.translate("MainWindow", "13", None)) - self.label_68.setText(QCoreApplication.translate("MainWindow", "14", None)) - self.label_67.setText(QCoreApplication.translate("MainWindow", "15", None)) - self.label_66.setText(QCoreApplication.translate("MainWindow", "16", None)) - self.label_69.setText(QCoreApplication.translate("MainWindow", "17", None)) - self.label_81.setText(QCoreApplication.translate("MainWindow", "18", None)) - self.label_82.setText(QCoreApplication.translate("MainWindow", "19", None)) - self.label_78.setText(QCoreApplication.translate("MainWindow", "20", None)) - self.label_72.setText(QCoreApplication.translate("MainWindow", "21", None)) - self.label_84.setText(QCoreApplication.translate("MainWindow", "22", None)) - self.label_77.setText(QCoreApplication.translate("MainWindow", "23", None)) - self.label_71.setText(QCoreApplication.translate("MainWindow", "24", None)) - self.label_70.setText(QCoreApplication.translate("MainWindow", "25", None)) - self.label_80.setText(QCoreApplication.translate("MainWindow", "26", None)) - self.label_74.setText(QCoreApplication.translate("MainWindow", "27", None)) - self.label_73.setText(QCoreApplication.translate("MainWindow", "28", None)) - self.label_75.setText(QCoreApplication.translate("MainWindow", "29", None)) - self.label_76.setText(QCoreApplication.translate("MainWindow", "30", None)) - self.label_83.setText(QCoreApplication.translate("MainWindow", "31", None)) - self.label_79.setText(QCoreApplication.translate("MainWindow", "32", None)) - self.label_92.setText(QCoreApplication.translate("MainWindow", "V1:", None)) - self.label_88.setText(QCoreApplication.translate("MainWindow", "Z1:", None)) - self.label_93.setText(QCoreApplication.translate("MainWindow", "Y1:", None)) - self.label_95.setText(QCoreApplication.translate("MainWindow", "U1:", None)) - self.label_90.setText(QCoreApplication.translate("MainWindow", "X1:", None)) - self.label_91.setText(QCoreApplication.translate("MainWindow", "W1:", None)) - self.pushButton_get_origin.setText( - QCoreApplication.translate("MainWindow", "\u83b7\u53d6\u539f\u70b9", None) - ) - self.pushButton_set_origin.setText( - QCoreApplication.translate("MainWindow", "\u4fdd\u5b58\u539f\u70b9", None) - ) - self.pushButton_get_p2.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d2", None) - ) - self.pushButton_set_p1.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d1", None) - ) - self.label_16.setText(QCoreApplication.translate("MainWindow", "X2:", None)) - self.pushButton_set_p4.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d4", None) - ) - self.label_21.setText(QCoreApplication.translate("MainWindow", "Y3:", None)) - self.label_41.setText(QCoreApplication.translate("MainWindow", "W2:", None)) - self.label_44.setText(QCoreApplication.translate("MainWindow", "U3:", None)) - self.pushButton_get_p4.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d4", None) - ) - self.label_50.setText(QCoreApplication.translate("MainWindow", "W5:", None)) - self.label_25.setText(QCoreApplication.translate("MainWindow", "Z5:", None)) - self.label_40.setText(QCoreApplication.translate("MainWindow", "V2:", None)) - self.label_43.setText(QCoreApplication.translate("MainWindow", "W3:", None)) - self.label_37.setText(QCoreApplication.translate("MainWindow", "W1:", None)) - self.pushButton_set_p5.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d5", None) - ) - self.pushButton_set_p3.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d3", None) - ) - self.label_26.setText(QCoreApplication.translate("MainWindow", "Y5:", None)) - self.label_19.setText(QCoreApplication.translate("MainWindow", "X3:", None)) - self.label_42.setText(QCoreApplication.translate("MainWindow", "V3:", None)) - self.label_18.setText(QCoreApplication.translate("MainWindow", "Y2:", None)) - self.label_48.setText(QCoreApplication.translate("MainWindow", "V5:", None)) - self.label_38.setText(QCoreApplication.translate("MainWindow", "V1:", None)) - self.pushButton_get_p5.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d5", None) - ) - self.label_20.setText(QCoreApplication.translate("MainWindow", "Z3:", None)) - self.label_27.setText(QCoreApplication.translate("MainWindow", "X5:", None)) - self.label_22.setText(QCoreApplication.translate("MainWindow", "X4:", None)) - self.label_46.setText(QCoreApplication.translate("MainWindow", "W4:", None)) - self.label_14.setText(QCoreApplication.translate("MainWindow", "Y1:", None)) - self.label_15.setText(QCoreApplication.translate("MainWindow", "Z1:", None)) - self.label_39.setText(QCoreApplication.translate("MainWindow", "U2:", None)) - self.label_23.setText(QCoreApplication.translate("MainWindow", "Y4:", None)) - self.label_9.setText(QCoreApplication.translate("MainWindow", "X1:", None)) - self.label_49.setText(QCoreApplication.translate("MainWindow", "U5:", None)) - self.label_45.setText(QCoreApplication.translate("MainWindow", "U4:", None)) - self.pushButton_get_p3.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d3", None) - ) - self.label_47.setText(QCoreApplication.translate("MainWindow", "V4:", None)) - self.pushButton_get_p1.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d1", None) - ) - self.pushButton_set_p2.setText( - QCoreApplication.translate("MainWindow", "\u8bb0\u5f55\u70b9\u4f4d2", None) - ) - self.label_24.setText(QCoreApplication.translate("MainWindow", "Z4:", None)) - self.label_36.setText(QCoreApplication.translate("MainWindow", "U1:", None)) - self.label_17.setText(QCoreApplication.translate("MainWindow", "Z2:", None)) - self.pushButton_saveSeting.setText( - QCoreApplication.translate("MainWindow", "\u4fdd\u5b58\u8bbe\u7f6e", None) - ) - self.label_51.setText( - QCoreApplication.translate("MainWindow", "\u6293\u53d6\u70b9\u4f4d:", None) - ) - self.label_54.setText( - QCoreApplication.translate("MainWindow", "\u6447\u6643\u70b9\u4f4d:", None) - ) - self.label_85.setText( - QCoreApplication.translate( - "MainWindow", "\u6447\u6643\u5ef6\u65f6\uff1a", None - ) - ) - self.label_94.setText( - QCoreApplication.translate( - "MainWindow", "\u590d\u4f4d\u901f\u5ea6\uff1a", None - ) - ) - self.label_28.setText( - QCoreApplication.translate( - "MainWindow", "\u751f\u4ea7\u901f\u5ea6\uff1a", None - ) - ) - self.label_29.setText( - QCoreApplication.translate( - "MainWindow", "\u8c03\u8bd5\u901f\u5ea6\uff1a", None - ) - ) - self.label_87.setText( - QCoreApplication.translate( - "MainWindow", "\u6293\u53d6\u5ef6\u65f6\uff1a", None - ) - ) - self.label_52.setText( - QCoreApplication.translate( - "MainWindow", "\u629b\u888b\u70b9\u4f4d\uff1a", None - ) - ) - self.label_89.setText( - QCoreApplication.translate( - "MainWindow", "\u5e73\u6ed1\u7cfb\u6570\uff1a", None - ) - ) - self.label_86.setText( - QCoreApplication.translate( - "MainWindow", "\u629b\u888b\u5ef6\u65f6\uff1a", None - ) - ) - self.label_96.setText( - QCoreApplication.translate( - "MainWindow", "\u52a8\u6001\u9ad8\u5ea6\uff1a", None - ) - ) - self.pushButton_j3_add.setText("") - self.pushButton_j5_add.setText("") - self.pushButton_j6_sub.setText("") - self.label_34.setText(QCoreApplication.translate("MainWindow", "J5", None)) - self.pushButton_j6_add.setText("") - self.label_j5_max.setText(QCoreApplication.translate("MainWindow", "150", None)) - self.pushButton_j2_add.setText("") - self.label_j1.setText("") - self.label_j2_min.setText( - QCoreApplication.translate("MainWindow", "-150", None) - ) - self.label_j5_min.setText( - QCoreApplication.translate("MainWindow", "-150", None) - ) - self.label_30.setText(QCoreApplication.translate("MainWindow", "J1", None)) - self.label_j6_min.setText( - QCoreApplication.translate("MainWindow", "-150", None) - ) - self.label_j3_min.setText( - QCoreApplication.translate("MainWindow", "-150", None) - ) - self.label_j3_max.setText(QCoreApplication.translate("MainWindow", "150", None)) - self.pushButton_j3_sub.setText("") - self.pushButton_j4_sub.setText("") - self.pushButton_j1_add.setText("") - self.label_j4_min.setText( - QCoreApplication.translate("MainWindow", "-150", None) - ) - self.pushButton_j1_sub.setText("") - self.pushButton_sendMove.setText( - QCoreApplication.translate("MainWindow", "\u786e\u5b9a\u79fb\u52a8", None) - ) - self.label_j1_max.setText(QCoreApplication.translate("MainWindow", "+10", None)) - self.label_j3.setText("") - self.pushButton_j5_sub.setText("") - self.label_j6_max.setText(QCoreApplication.translate("MainWindow", "150", None)) - self.label_j5.setText("") - self.label_35.setText(QCoreApplication.translate("MainWindow", "J6", None)) - self.label_j2_max.setText(QCoreApplication.translate("MainWindow", "150", None)) - self.label_32.setText(QCoreApplication.translate("MainWindow", "J3", None)) - self.pushButton_j4_add.setText("") - self.label_j6.setText("") - self.label_j1_min.setText(QCoreApplication.translate("MainWindow", "-10", None)) - self.label_j4.setText("") - self.pushButton_j2_sub.setText("") - self.label_j2.setText("") - self.label_31.setText(QCoreApplication.translate("MainWindow", "J2", None)) - self.label_manual_adjust_accuracy.setText( - QCoreApplication.translate( - "MainWindow", "\u8c03\u6574\u95f4\u9694\uff1a", None - ) - ) - self.label_j4_max.setText(QCoreApplication.translate("MainWindow", "150", None)) - self.label_33.setText(QCoreApplication.translate("MainWindow", "J4", None)) - self.lineEdit_manual_adjust_accuracy.setText( - QCoreApplication.translate("MainWindow", "1", None) - ) - self.lineEdit_manual_adjust_accuracy.setPlaceholderText( - QCoreApplication.translate("MainWindow", "0.001-20", None) - ) - self.pushButton_savePosition.setText( - QCoreApplication.translate("MainWindow", "\u4fdd\u5b58", None) - ) - self.label_table_line_title.setText( - QCoreApplication.translate("MainWindow", "\u751f\u4ea7\u7ebf", None) - ) - self.label_table_line_position_title.setText( - QCoreApplication.translate("MainWindow", "TextLabel", None) - ) - self.label_3.setText("") - self.label_date.setText( - QCoreApplication.translate("MainWindow", "2024-08-01", None) - ) - self.label_time.setText( - QCoreApplication.translate("MainWindow", "08:00:00", None) - ) - self.comboBox_lineIndex.setItemText( - 0, QCoreApplication.translate("MainWindow", "1\u53f7\u7ebf", None) - ) - self.comboBox_lineIndex.setItemText( - 1, QCoreApplication.translate("MainWindow", "\u65b0\u5efa\u7ebf", None) - ) - - self.comboBox_lineIndex.setCurrentText( - QCoreApplication.translate("MainWindow", "1\u53f7\u7ebf", None) - ) - self.pushButton_num1.setText( - QCoreApplication.translate("MainWindow", "10", None) - ) - self.pushButton_num2.setText( - QCoreApplication.translate("MainWindow", "20", None) - ) - self.pushButton_num3.setText( - QCoreApplication.translate("MainWindow", "30", None) - ) - self.pushButton_num4.setText( - QCoreApplication.translate("MainWindow", "40", None) - ) - self.pushButton_num5.setText( - QCoreApplication.translate("MainWindow", "50", None) - ) - self.pushButton_num6.setText( - QCoreApplication.translate("MainWindow", "60", None) - ) - self.lineEdit_num.setPlaceholderText( - QCoreApplication.translate( - "MainWindow", "\u81ea\u5b9a\u4e49\u6570\u91cf", None - ) - ) - self.pushButton_num_confirm.setText( - QCoreApplication.translate("MainWindow", "\u786e\u5b9a", None) - ) - self.pushButton_AddNum.setText( - QCoreApplication.translate("MainWindow", "\u8865\u4e00\u888b", None) - ) - self.pushButton_SubNum.setText( - QCoreApplication.translate("MainWindow", "\u6263\u4e00\u888b", None) - ) - self.pushButton_reset.setText( - QCoreApplication.translate("MainWindow", "\u590d\u4f4d", None) - ) - self.pushButton_emergency.setText( - QCoreApplication.translate("MainWindow", "\u6025\u505c", None) - ) - self.pushButton_stopFeed.setText( - QCoreApplication.translate("MainWindow", "\u505c\u6b62", None) - ) - self.pushButton_pauseFeed.setText( - QCoreApplication.translate("MainWindow", "\u6682\u505c", None) - ) - self.pushButton_startFeed.setText( - QCoreApplication.translate("MainWindow", "\u542f\u52a8", None) - ) - self.pushButton_clearAlarm.setText( - QCoreApplication.translate("MainWindow", "\u6e05\u9664\u62a5\u8b66", None) - ) - self.pushButton_onekeyfeed.setText( - QCoreApplication.translate("MainWindow", "\u4e00\u952e\u6295\u6599", None) - ) - self.label_4.setText( - QCoreApplication.translate( - "MainWindow", "\u76ee\u6807\u888b\u6570\uff1a", None - ) - ) - self.label_maxNum.setText(QCoreApplication.translate("MainWindow", "0", None)) - # self.label_6.setText( - # QCoreApplication.translate( - # "MainWindow", "\u5269\u4f59\u888b\u6570\uff1a", None - # ) - # ) - self.label_6.setText( - QCoreApplication.translate("MainWindow", "已投袋数:", None) - ) - self.label_remain_num.setText( - QCoreApplication.translate("MainWindow", "0", None) - ) - - # retranslateUi diff --git a/ui_MainWin.py b/ui_MainWin.py index 796dab4..9d521d4 100644 --- a/ui_MainWin.py +++ b/ui_MainWin.py @@ -628,7 +628,34 @@ class Ui_MainWindow(object): "border-image: None;") self.frame_sign_2.setFrameShape(QFrame.Shape.StyledPanel) self.frame_sign_2.setFrameShadow(QFrame.Shadow.Raised) - self.gridLayout_4 = QGridLayout(self.frame_sign_2) + + + # 9/30 新增显示 投料的重量的信息 + self.verticalLayout_sign = QVBoxLayout(self.frame_sign_2) + self.verticalLayout_sign.setObjectName(u"verticalLayout_sign") + self.verticalLayout_sign.setContentsMargins(0, 0, 0, 0) # 清除边距 + self.verticalLayout_sign.setSpacing(5) # 新标签与下方网格布局的间距 + + # 1. 添加新的信息标签(放在上方) + self.weight_label_info = QLabel(self.frame_sign_2) + self.weight_label_info.setObjectName(u"label_info") + # 设置标签样式 background-color: #2c2c2c; + self.weight_label_info.setStyleSheet(u""" + QLabel { + background-color: rgba(255, 255, 255, 0); + color: red; + font: 30pt "Microsoft YaHei UI"; + border-radius: 3px; + } + """) + self.weight_label_info.setText("未选择码垛重量") # 初始信息 + # self.weight_label_info.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) + self.weight_label_info.setAlignment(Qt.AlignmentFlag.AlignCenter) # 居中 + self.verticalLayout_sign.addWidget(self.weight_label_info) + + # 9/10 + # self.gridLayout_4 = QGridLayout(self.frame_sign_2) + self.gridLayout_4 = QGridLayout() self.gridLayout_4.setObjectName(u"gridLayout_4") self.pushButton_sign_go = QPushButton(self.frame_sign_2) self.pushButton_sign_go.setObjectName(u"pushButton_sign_go") @@ -786,6 +813,8 @@ class Ui_MainWindow(object): self.gridLayout_4.addWidget(self.label_sign_feed, 0, 7, 1, 1) + # 9/10 添加 取料中、拍照中等布局 + self.verticalLayout_sign.addLayout(self.gridLayout_4) self.verticalLayout_14.addWidget(self.frame_sign_2) @@ -3307,8 +3336,50 @@ class Ui_MainWindow(object): " padding: 4px 4px 4px 4px;\n" " outline: none;\n" "}") - + self.comboBox_lineIndex.setVisible(False) self.verticalLayout_11.addWidget(self.comboBox_lineIndex) + # 9/29 新增重量选择框 和 选择投料重量提示 + weight_h_layout = QHBoxLayout() + # weight_h_layout.setSpacing(10) + # self.weight_label = QLabel(self.frame_20) + # self.weight_label.setText("选择料袋重量:") + # self.weight_label.setStyleSheet("color: white;") + # weight_h_layout.addWidget(self.weight_label) + + self.comboBox_dropWeight = QComboBox(self.frame_20) + self.comboBox_dropWeight.setObjectName(u"comboBox_dropWeight") + self.comboBox_dropWeight.setStyleSheet(u"QComboBox {\n" +" border-radius: 10px;\n" +" font-size: 30px;\n" +" margin: 0px 10px;\n" +" padding: 5px 5px 5px 5px;\n" +" background-color: #2c2c2c;\n" +" color: white;\n" +" border: 1px solid #474747;\n" +" min-width: 80px;\n" +"}\n" +"\n" +"\n" +"QComboBox::drop-down {\n" +" width: 0px;\n" +" border: none;\n" +"\n" +"}\n" +"\n" +"QComboBox::down-arrow {\n" +" image: none;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView {\n" +" border-bottom-right-radius: 10px;\n" +" border-bottom-left-radius: 10px;\n" +" background-color: #D3D3D3;\n" +" border: 1px solid gray;\n" +" padding: 4px 4px 4px 4px;\n" +" outline: none;\n" +"}") + weight_h_layout.addWidget(self.comboBox_dropWeight) + self.verticalLayout_11.addLayout(weight_h_layout) self.stackedWidget_num = QStackedWidget(self.frame_20) self.stackedWidget_num.setObjectName(u"stackedWidget_num") diff --git a/ui_untitled.py b/ui_untitled.py deleted file mode 100644 index 8a479d7..0000000 --- a/ui_untitled.py +++ /dev/null @@ -1,1422 +0,0 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'untitled.ui' -## -## Created by: Qt User Interface Compiler version 6.7.2 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, - QMetaObject, QObject, QPoint, QRect, - QSize, QTime, QUrl, Qt) -from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, - QFont, QFontDatabase, QGradient, QIcon, - QImage, QKeySequence, QLinearGradient, QPainter, - QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QApplication, QComboBox, QFrame, QHeaderView, - QLabel, QLineEdit, QMainWindow, QPushButton, - QSizePolicy, QSlider, QStackedWidget, QTabWidget, - QTableWidget, QTableWidgetItem, QTextEdit, QWidget) -import resources_rc - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - if not MainWindow.objectName(): - MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(901, 665) - MainWindow.setStyleSheet(u"background-color: rgb(12, 78, 139);") - MainWindow.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly) - self.centralwidget = QWidget(MainWindow) - self.centralwidget.setObjectName(u"centralwidget") - self.label_time = QLabel(self.centralwidget) - self.label_time.setObjectName(u"label_time") - self.label_time.setGeometry(QRect(780, 640, 91, 16)) - self.label_time.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.tabWidget = QTabWidget(self.centralwidget) - self.tabWidget.setObjectName(u"tabWidget") - self.tabWidget.setGeometry(QRect(0, 0, 901, 631)) - self.tabWidget.setStyleSheet(u"background-color:#E6ECF5;") - self.tab = QWidget() - self.tab.setObjectName(u"tab") - self.pushButton_stack_feedControl = QPushButton(self.tab) - self.pushButton_stack_feedControl.setObjectName(u"pushButton_stack_feedControl") - self.pushButton_stack_feedControl.setGeometry(QRect(0, 8, 101, 31)) - self.pushButton_stack_feedControl.setStyleSheet(u"background-color: #F9FAFC;\n" -"font: 700 9pt \"Microsoft YaHei UI\";\n" -"\n" -"border: 1px solid #dcdfe6;\n" -"") - self.pushButton_stack_feedSet = QPushButton(self.tab) - self.pushButton_stack_feedSet.setObjectName(u"pushButton_stack_feedSet") - self.pushButton_stack_feedSet.setGeometry(QRect(110, 8, 101, 31)) - self.pushButton_stack_feedSet.setStyleSheet(u"background-color: #F9FAFC;\n" -"font: 700 9pt \"Microsoft YaHei UI\";\n" -"\n" -"border: 1px solid #dcdfe6;\n" -"") - self.pushButton_8 = QPushButton(self.tab) - self.pushButton_8.setObjectName(u"pushButton_8") - self.pushButton_8.setGeometry(QRect(230, 8, 101, 31)) - self.pushButton_8.setStyleSheet(u"background-color: #F9FAFC;\n" -"font: 700 9pt \"Microsoft YaHei UI\";\n" -"\n" -"border: 1px solid #dcdfe6;\n" -"") - self.stackedWidget_feed = QStackedWidget(self.tab) - self.stackedWidget_feed.setObjectName(u"stackedWidget_feed") - self.stackedWidget_feed.setGeometry(QRect(-10, 40, 891, 561)) - self.page_6 = QWidget() - self.page_6.setObjectName(u"page_6") - self.frame_2 = QFrame(self.page_6) - self.frame_2.setObjectName(u"frame_2") - self.frame_2.setGeometry(QRect(0, -10, 877, 571)) - self.frame_2.setStyleSheet(u"background-color: #E6ECF5;\n" -"") - self.frame_2.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_2.setFrameShadow(QFrame.Shadow.Raised) - self.frame_6 = QFrame(self.frame_2) - self.frame_6.setObjectName(u"frame_6") - self.frame_6.setGeometry(QRect(10, 10, 861, 561)) - self.frame_6.setStyleSheet(u"background-color: rgb(255, 255, 255);") - self.frame_6.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_6.setFrameShadow(QFrame.Shadow.Raised) - self.label_showDetection = QLabel(self.frame_6) - self.label_showDetection.setObjectName(u"label_showDetection") - self.label_showDetection.setGeometry(QRect(10, 10, 481, 251)) - self.label_showDetection.setStyleSheet(u"\n" -"background-image: url(:/bg/Image/robot.png);\n" -"background-position:center;\n" -"background-repeat:no-repeat;") - self.label_showDetection.setScaledContents(True) - self.horizontalSlider_feedingNum = QSlider(self.frame_6) - self.horizontalSlider_feedingNum.setObjectName(u"horizontalSlider_feedingNum") - self.horizontalSlider_feedingNum.setGeometry(QRect(520, 150, 271, 41)) - self.horizontalSlider_feedingNum.setStyleSheet(u"/**QSlider\n" -"{\n" -" background-color: #FFFFFF; \n" -" border-style: outset; \n" -" border-radius:5px; \n" -"}\n" -" \n" -"QSlider::groove:horizontal\n" -"{\n" -" height: 10px;\n" -" background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);\n" -" margin: 10px 0\n" -"}\n" -" \n" -"QSlider::handle:horizontal \n" -"{\n" -" background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green);\n" -" width: 10px;\n" -" height: 16px;\n" -" margin: -5px 3px -5px 6px;\n" -" border-radius:5px; \n" -" border: 3px solid #007900;\n" -"}\n" -"**/\n" -"/*\u7b2c\u4e00\u79cd\u98ce\u683c*/\n" -"/**\n" -" groove\u8868\u793a\u69fd\u7684\u90e8\u5206\n" -" handle\u8868\u793a\u6ed1\u5757\n" -" add-page\u8868\u793a\u672a\u6ed1\u8fc7\u7684\u69fd\u90e8\u5206\n" -" sub-page\u8868\u793a\u5df2\u6ed1\u8fc7\u7684\u69fd\u90e8\u5206\n" -" \u5728\u8f85\u52a9\u63a7\u5236\u5668\u540e\u9762\u53ef\u4ee5\u8bbe\u7f6e\u72b6\u6001\uff0chorizontal\u5c31\u662fQSS\u751f\u6548\u7684QSlider\u7684\u72b6\u6001\n" -"*" - "*/\n" -"\n" -"QSlider::groove:horizontal\n" -"{\n" -" height:10px;\n" -" border-radius: 5px;\n" -" background-color:rgb(219,219,219);\n" -"}\n" -"\n" -"\n" -"QSlider::handle:horizontal \n" -"{\n" -" background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5,stop:0 green, stop:1 green);\n" -" width: 5px;\n" -" height: 5px;\n" -" margin: -5px 3px -5px 6px;\n" -" border-radius:5px; \n" -" border: 3px solid #007900;\n" -"}\n" -"\n" -"QSlider::add-page:horizontal\n" -"{\n" -" border-radius: 5px;\n" -" background-color: rgb(219,219,219);\n" -"}\n" -" \n" -"QSlider::sub-page:horizontal\n" -"{\n" -" border-radius: 5px;\n" -" background-color: rgb(80,166,234);\n" -"}\n" -"\n" -"\n" -"\n" -"\n" -"\n" -"") - self.horizontalSlider_feedingNum.setOrientation(Qt.Orientation.Horizontal) - self.label_maxNum = QLabel(self.frame_6) - self.label_maxNum.setObjectName(u"label_maxNum") - self.label_maxNum.setGeometry(QRect(800, 160, 31, 21)) - self.label_maxNum.setStyleSheet(u"font: 9pt \"\u6977\u4f53\";") - self.comboBox_lineIndex = QComboBox(self.frame_6) - self.comboBox_lineIndex.addItem("") - self.comboBox_lineIndex.addItem("") - self.comboBox_lineIndex.setObjectName(u"comboBox_lineIndex") - self.comboBox_lineIndex.setGeometry(QRect(520, 10, 271, 41)) - self.comboBox_lineIndex.setStyleSheet(u"QComboBox {\n" -" border-radius: 10px;\n" -" padding: 5px 5px 5px 5px;\n" -" background-color: #2c2c2c;\n" -" color: white;\n" -" border: 1px solid #474747;\n" -" min-width: 80px;\n" -"}\n" -"\n" -"\n" -"QComboBox::drop-down {\n" -" width: 0px;\n" -" border: none;\n" -"\n" -"}\n" -"\n" -"QComboBox::down-arrow {\n" -" image: none;\n" -"}\n" -"\n" -"QComboBox QAbstractItemView {\n" -" border-bottom-right-radius: 10px;\n" -" border-bottom-left-radius: 10px;\n" -" background-color: #D3D3D3;\n" -" border: 1px solid gray;\n" -" padding: 4px 4px 4px 4px;\n" -" outline: none;\n" -"}") - self.stackedWidget_num = QStackedWidget(self.frame_6) - self.stackedWidget_num.setObjectName(u"stackedWidget_num") - self.stackedWidget_num.setGeometry(QRect(510, 60, 291, 91)) - self.stackedWidget_num.setStyleSheet(u"background-color: rgb(255, 255, 255);") - self.page_9 = QWidget() - self.page_9.setObjectName(u"page_9") - self.pushButton_num5 = QPushButton(self.page_9) - self.pushButton_num5.setObjectName(u"pushButton_num5") - self.pushButton_num5.setGeometry(QRect(10, 60, 61, 31)) - self.pushButton_num5.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.pushButton_num1 = QPushButton(self.page_9) - self.pushButton_num1.setObjectName(u"pushButton_num1") - self.pushButton_num1.setGeometry(QRect(10, 20, 61, 31)) - self.pushButton_num1.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.pushButton_num6 = QPushButton(self.page_9) - self.pushButton_num6.setObjectName(u"pushButton_num6") - self.pushButton_num6.setGeometry(QRect(80, 60, 61, 31)) - self.pushButton_num6.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.pushButton_num3 = QPushButton(self.page_9) - self.pushButton_num3.setObjectName(u"pushButton_num3") - self.pushButton_num3.setGeometry(QRect(150, 20, 61, 31)) - self.pushButton_num3.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.pushButton_num4 = QPushButton(self.page_9) - self.pushButton_num4.setObjectName(u"pushButton_num4") - self.pushButton_num4.setGeometry(QRect(220, 20, 61, 31)) - self.pushButton_num4.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.pushButton_num_free = QPushButton(self.page_9) - self.pushButton_num_free.setObjectName(u"pushButton_num_free") - self.pushButton_num_free.setGeometry(QRect(150, 60, 61, 31)) - self.pushButton_num_free.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.pushButton_num2 = QPushButton(self.page_9) - self.pushButton_num2.setObjectName(u"pushButton_num2") - self.pushButton_num2.setGeometry(QRect(80, 20, 61, 31)) - self.pushButton_num2.setStyleSheet(u"\n" -"*{background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.lineEdit_num = QLineEdit(self.page_9) - self.lineEdit_num.setObjectName(u"lineEdit_num") - self.lineEdit_num.setGeometry(QRect(150, 60, 61, 31)) - self.lineEdit_num.setStyleSheet(u"background-color: #F9FAFC;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";") - self.lineEdit_num.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.stackedWidget_num.addWidget(self.page_9) - self.lineEdit_num.raise_() - self.pushButton_num_free.raise_() - self.pushButton_num5.raise_() - self.pushButton_num1.raise_() - self.pushButton_num6.raise_() - self.pushButton_num3.raise_() - self.pushButton_num4.raise_() - self.pushButton_num2.raise_() - self.page_10 = QWidget() - self.page_10.setObjectName(u"page_10") - self.pushButton_AddNum = QPushButton(self.page_10) - self.pushButton_AddNum.setObjectName(u"pushButton_AddNum") - self.pushButton_AddNum.setGeometry(QRect(30, 30, 91, 41)) - self.pushButton_AddNum.setStyleSheet(u"*{\n" -"background-color: #499C54;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListAdd)) - self.pushButton_AddNum.setIcon(icon) - self.pushButton_SubNum = QPushButton(self.page_10) - self.pushButton_SubNum.setObjectName(u"pushButton_SubNum") - self.pushButton_SubNum.setGeometry(QRect(170, 30, 91, 41)) - self.pushButton_SubNum.setStyleSheet(u"*{\n" -"background-color: rgb(255, 0, 0);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon1 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ListRemove)) - self.pushButton_SubNum.setIcon(icon1) - self.stackedWidget_num.addWidget(self.page_10) - self.lineEdit_speed = QLineEdit(self.frame_6) - self.lineEdit_speed.setObjectName(u"lineEdit_speed") - self.lineEdit_speed.setGeometry(QRect(110, 530, 113, 21)) - self.label_2 = QLabel(self.frame_6) - self.label_2.setObjectName(u"label_2") - self.label_2.setGeometry(QRect(10, 530, 81, 16)) - self.pushButton_speed = QPushButton(self.frame_6) - self.pushButton_speed.setObjectName(u"pushButton_speed") - self.pushButton_speed.setGeometry(QRect(100, 530, 75, 23)) - self.pushButton_speed.setStyleSheet(u"\n" -"*{background-color: #A2EF4D;\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover {\n" -" background-color: lightgreen;\n" -" color: black;\n" -"}*:pressed {\n" -" background-color: red;\n" -" color: white;\n" -" }") - self.tabWidget_2 = QTabWidget(self.frame_6) - self.tabWidget_2.setObjectName(u"tabWidget_2") - self.tabWidget_2.setGeometry(QRect(10, 270, 491, 241)) - self.tab_3 = QWidget() - self.tab_3.setObjectName(u"tab_3") - self.textEdit_log_info = QTextEdit(self.tab_3) - self.textEdit_log_info.setObjectName(u"textEdit_log_info") - self.textEdit_log_info.setGeometry(QRect(0, 0, 491, 211)) - self.textEdit_log_info.setStyleSheet(u"*{\n" -" background-color: #D3D3D3;\n" -"}") - self.tabWidget_2.addTab(self.tab_3, "") - self.tab_4 = QWidget() - self.tab_4.setObjectName(u"tab_4") - self.textEdit_log_error = QTextEdit(self.tab_4) - self.textEdit_log_error.setObjectName(u"textEdit_log_error") - self.textEdit_log_error.setGeometry(QRect(0, 0, 491, 231)) - self.textEdit_log_error.setStyleSheet(u"*{\n" -" color: red;\n" -"\n" -" background-color: #D3D3D3;\n" -"}\n" -"") - self.tabWidget_2.addTab(self.tab_4, "") - self.label_move_sign = QLabel(self.frame_6) - self.label_move_sign.setObjectName(u"label_move_sign") - self.label_move_sign.setGeometry(QRect(390, 230, 91, 21)) - self.label_move_sign.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"color: red;") - self.label_move_sign.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.tabWidget_control = QTabWidget(self.frame_6) - self.tabWidget_control.setObjectName(u"tabWidget_control") - self.tabWidget_control.setGeometry(QRect(510, 190, 341, 321)) - self.tabWidget_control.setStyleSheet(u"QTabBar::tab {\n" -" background: #C0C0C0;\n" -" padding: 10px;\n" -" border-radius: 15px;\n" -"}\n" -"QTabBar::tab:selected {\n" -" background-color: #FFFFFF;\n" -" border:2px solid #008000;\n" -" border-radius: 15px 15px 0 0; /* \u5706\u89d2\u63a7\u5236 */\n" -"}") - self.tab_6 = QWidget() - self.tab_6.setObjectName(u"tab_6") - self.frame_3 = QFrame(self.tab_6) - self.frame_3.setObjectName(u"frame_3") - self.frame_3.setGeometry(QRect(0, 0, 331, 281)) - self.frame_3.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_3.setFrameShadow(QFrame.Shadow.Raised) - self.pushButton_startFeed = QPushButton(self.frame_3) - self.pushButton_startFeed.setObjectName(u"pushButton_startFeed") - self.pushButton_startFeed.setGeometry(QRect(10, 10, 91, 31)) - self.pushButton_startFeed.setStyleSheet(u"*{\n" -"background-color: #499C54;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon2 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart)) - self.pushButton_startFeed.setIcon(icon2) - self.pushButton_pauseFeed = QPushButton(self.frame_3) - self.pushButton_pauseFeed.setObjectName(u"pushButton_pauseFeed") - self.pushButton_pauseFeed.setGeometry(QRect(110, 10, 91, 31)) - self.pushButton_pauseFeed.setStyleSheet(u"*{\n" -"background-color: #2196F3;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon3 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause)) - self.pushButton_pauseFeed.setIcon(icon3) - self.pushButton_stopFeed = QPushButton(self.frame_3) - self.pushButton_stopFeed.setObjectName(u"pushButton_stopFeed") - self.pushButton_stopFeed.setGeometry(QRect(210, 10, 91, 31)) - self.pushButton_stopFeed.setStyleSheet(u"*{\n" -"background-color: #F44336;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - icon4 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemShutdown)) - self.pushButton_stopFeed.setIcon(icon4) - self.pushButton_reset = QPushButton(self.frame_3) - self.pushButton_reset.setObjectName(u"pushButton_reset") - self.pushButton_reset.setGeometry(QRect(10, 50, 91, 31)) - self.pushButton_reset.setStyleSheet(u"*{\n" -"background-color: #FFFFBF;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #FFF000;\n" -"}\n" -"") - icon5 = QIcon(QIcon.fromTheme(u"media-optical")) - self.pushButton_reset.setIcon(icon5) - self.pushButton_17 = QPushButton(self.frame_3) - self.pushButton_17.setObjectName(u"pushButton_17") - self.pushButton_17.setGeometry(QRect(110, 50, 91, 31)) - self.pushButton_17.setStyleSheet(u"*{\n" -"background-color: rgb(255, 0, 0);\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - icon6 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.WindowClose)) - self.pushButton_17.setIcon(icon6) - self.pushButton_clearAlarm = QPushButton(self.frame_3) - self.pushButton_clearAlarm.setObjectName(u"pushButton_clearAlarm") - self.pushButton_clearAlarm.setGeometry(QRect(210, 50, 91, 31)) - self.pushButton_clearAlarm.setStyleSheet(u"*{\n" -"background-color: #1CB2B1;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 10px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color:#1cb052;\n" -"}\n" -"\n" -"") - icon7 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.SystemReboot)) - self.pushButton_clearAlarm.setIcon(icon7) - self.tabWidget_control.addTab(self.tab_6, "") - self.tab_5 = QWidget() - self.tab_5.setObjectName(u"tab_5") - self.frame_7 = QFrame(self.tab_5) - self.frame_7.setObjectName(u"frame_7") - self.frame_7.setGeometry(QRect(0, 0, 331, 281)) - self.frame_7.setStyleSheet(u"background-color: rgb(85, 170, 255);") - self.frame_7.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_7.setFrameShadow(QFrame.Shadow.Raised) - self.horizontalSlider_J1 = QSlider(self.frame_7) - self.horizontalSlider_J1.setObjectName(u"horizontalSlider_J1") - self.horizontalSlider_J1.setGeometry(QRect(65, 50, 171, 22)) - self.horizontalSlider_J1.setOrientation(Qt.Orientation.Horizontal) - self.label_j1_min = QLabel(self.frame_7) - self.label_j1_min.setObjectName(u"label_j1_min") - self.label_j1_min.setGeometry(QRect(65, 30, 31, 21)) - self.label_j1_max = QLabel(self.frame_7) - self.label_j1_max.setObjectName(u"label_j1_max") - self.label_j1_max.setGeometry(QRect(215, 30, 31, 21)) - self.label_j2_min = QLabel(self.frame_7) - self.label_j2_min.setObjectName(u"label_j2_min") - self.label_j2_min.setGeometry(QRect(65, 70, 53, 21)) - self.label_j2_max = QLabel(self.frame_7) - self.label_j2_max.setObjectName(u"label_j2_max") - self.label_j2_max.setGeometry(QRect(215, 70, 21, 21)) - self.horizontalSlider_J2 = QSlider(self.frame_7) - self.horizontalSlider_J2.setObjectName(u"horizontalSlider_J2") - self.horizontalSlider_J2.setGeometry(QRect(65, 90, 171, 22)) - self.horizontalSlider_J2.setOrientation(Qt.Orientation.Horizontal) - self.label_j3_min = QLabel(self.frame_7) - self.label_j3_min.setObjectName(u"label_j3_min") - self.label_j3_min.setGeometry(QRect(65, 110, 53, 21)) - self.label_j3_max = QLabel(self.frame_7) - self.label_j3_max.setObjectName(u"label_j3_max") - self.label_j3_max.setGeometry(QRect(215, 110, 21, 21)) - self.horizontalSlider_J3 = QSlider(self.frame_7) - self.horizontalSlider_J3.setObjectName(u"horizontalSlider_J3") - self.horizontalSlider_J3.setGeometry(QRect(65, 130, 171, 22)) - self.horizontalSlider_J3.setOrientation(Qt.Orientation.Horizontal) - self.label_j5_min = QLabel(self.frame_7) - self.label_j5_min.setObjectName(u"label_j5_min") - self.label_j5_min.setGeometry(QRect(65, 190, 53, 21)) - self.horizontalSlider_J5 = QSlider(self.frame_7) - self.horizontalSlider_J5.setObjectName(u"horizontalSlider_J5") - self.horizontalSlider_J5.setGeometry(QRect(65, 210, 171, 22)) - self.horizontalSlider_J5.setOrientation(Qt.Orientation.Horizontal) - self.label_j5_max = QLabel(self.frame_7) - self.label_j5_max.setObjectName(u"label_j5_max") - self.label_j5_max.setGeometry(QRect(215, 190, 21, 21)) - self.label_j6_min = QLabel(self.frame_7) - self.label_j6_min.setObjectName(u"label_j6_min") - self.label_j6_min.setGeometry(QRect(65, 230, 53, 21)) - self.horizontalSlider_J6 = QSlider(self.frame_7) - self.horizontalSlider_J6.setObjectName(u"horizontalSlider_J6") - self.horizontalSlider_J6.setGeometry(QRect(65, 250, 171, 22)) - self.horizontalSlider_J6.setOrientation(Qt.Orientation.Horizontal) - self.label_j6_max = QLabel(self.frame_7) - self.label_j6_max.setObjectName(u"label_j6_max") - self.label_j6_max.setGeometry(QRect(215, 230, 21, 21)) - self.label_j4_min = QLabel(self.frame_7) - self.label_j4_min.setObjectName(u"label_j4_min") - self.label_j4_min.setGeometry(QRect(65, 150, 53, 21)) - self.horizontalSlider_J4 = QSlider(self.frame_7) - self.horizontalSlider_J4.setObjectName(u"horizontalSlider_J4") - self.horizontalSlider_J4.setGeometry(QRect(65, 170, 171, 22)) - self.horizontalSlider_J4.setOrientation(Qt.Orientation.Horizontal) - self.label_j4_max = QLabel(self.frame_7) - self.label_j4_max.setObjectName(u"label_j4_max") - self.label_j4_max.setGeometry(QRect(215, 150, 21, 21)) - self.label_26 = QLabel(self.frame_7) - self.label_26.setObjectName(u"label_26") - self.label_26.setGeometry(QRect(15, 50, 21, 21)) - self.label_26.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_27 = QLabel(self.frame_7) - self.label_27.setObjectName(u"label_27") - self.label_27.setGeometry(QRect(15, 90, 21, 21)) - self.label_27.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_28 = QLabel(self.frame_7) - self.label_28.setObjectName(u"label_28") - self.label_28.setGeometry(QRect(15, 130, 21, 21)) - self.label_28.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_29 = QLabel(self.frame_7) - self.label_29.setObjectName(u"label_29") - self.label_29.setGeometry(QRect(15, 170, 21, 21)) - self.label_29.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_30 = QLabel(self.frame_7) - self.label_30.setObjectName(u"label_30") - self.label_30.setGeometry(QRect(15, 210, 21, 21)) - self.label_30.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_31 = QLabel(self.frame_7) - self.label_31.setObjectName(u"label_31") - self.label_31.setGeometry(QRect(15, 250, 21, 21)) - self.label_31.setStyleSheet(u"font: 700 9pt \"Microsoft YaHei UI\";") - self.pushButton_j1_add = QPushButton(self.frame_7) - self.pushButton_j1_add.setObjectName(u"pushButton_j1_add") - self.pushButton_j1_add.setGeometry(QRect(245, 50, 31, 21)) - self.pushButton_j1_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(0, 255, 0);\n" -"}\n" -"") - self.pushButton_j1_add.setIcon(icon) - self.pushButton_j1_sub = QPushButton(self.frame_7) - self.pushButton_j1_sub.setObjectName(u"pushButton_j1_sub") - self.pushButton_j1_sub.setGeometry(QRect(30, 50, 31, 21)) - self.pushButton_j1_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j1_sub.setIcon(icon1) - self.pushButton_j2_sub = QPushButton(self.frame_7) - self.pushButton_j2_sub.setObjectName(u"pushButton_j2_sub") - self.pushButton_j2_sub.setGeometry(QRect(30, 90, 31, 21)) - self.pushButton_j2_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j2_sub.setIcon(icon1) - self.pushButton_j2_add = QPushButton(self.frame_7) - self.pushButton_j2_add.setObjectName(u"pushButton_j2_add") - self.pushButton_j2_add.setGeometry(QRect(245, 90, 31, 21)) - self.pushButton_j2_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j2_add.setIcon(icon) - self.pushButton_j3_sub = QPushButton(self.frame_7) - self.pushButton_j3_sub.setObjectName(u"pushButton_j3_sub") - self.pushButton_j3_sub.setGeometry(QRect(30, 130, 31, 21)) - self.pushButton_j3_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j3_sub.setIcon(icon1) - self.pushButton_j3_add = QPushButton(self.frame_7) - self.pushButton_j3_add.setObjectName(u"pushButton_j3_add") - self.pushButton_j3_add.setGeometry(QRect(245, 130, 31, 21)) - self.pushButton_j3_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j3_add.setIcon(icon) - self.pushButton_j4_add = QPushButton(self.frame_7) - self.pushButton_j4_add.setObjectName(u"pushButton_j4_add") - self.pushButton_j4_add.setGeometry(QRect(245, 170, 31, 21)) - self.pushButton_j4_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j4_add.setIcon(icon) - self.pushButton_j5_sub = QPushButton(self.frame_7) - self.pushButton_j5_sub.setObjectName(u"pushButton_j5_sub") - self.pushButton_j5_sub.setGeometry(QRect(30, 210, 31, 21)) - self.pushButton_j5_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j5_sub.setIcon(icon1) - self.pushButton_j6_add = QPushButton(self.frame_7) - self.pushButton_j6_add.setObjectName(u"pushButton_j6_add") - self.pushButton_j6_add.setGeometry(QRect(245, 250, 31, 21)) - self.pushButton_j6_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j6_add.setIcon(icon) - self.pushButton_j6_sub = QPushButton(self.frame_7) - self.pushButton_j6_sub.setObjectName(u"pushButton_j6_sub") - self.pushButton_j6_sub.setGeometry(QRect(30, 250, 31, 21)) - self.pushButton_j6_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j6_sub.setIcon(icon1) - self.pushButton_j4_sub = QPushButton(self.frame_7) - self.pushButton_j4_sub.setObjectName(u"pushButton_j4_sub") - self.pushButton_j4_sub.setGeometry(QRect(30, 170, 31, 21)) - self.pushButton_j4_sub.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color: rgb(255, 0, 0);\n" -"}\n" -"") - self.pushButton_j4_sub.setIcon(icon1) - self.pushButton_j5_add = QPushButton(self.frame_7) - self.pushButton_j5_add.setObjectName(u"pushButton_j5_add") - self.pushButton_j5_add.setGeometry(QRect(245, 210, 31, 21)) - self.pushButton_j5_add.setStyleSheet(u"*{\n" -"background-color: #E7EAEA;\n" -"border-radius: 10px;\n" -"font: 10pt \"\u6977\u4f53\";\n" -"}\n" -"*:hover{\n" -" background-color: rgb(85, 85, 255);\n" -"}\n" -"*:pressed{\n" -" background-color:rgb(85, 85, 255);\n" -"}\n" -"") - self.pushButton_j5_add.setIcon(icon) - self.lineEdit_j1 = QLineEdit(self.frame_7) - self.lineEdit_j1.setObjectName(u"lineEdit_j1") - self.lineEdit_j1.setGeometry(QRect(285, 50, 41, 21)) - self.lineEdit_j2 = QLineEdit(self.frame_7) - self.lineEdit_j2.setObjectName(u"lineEdit_j2") - self.lineEdit_j2.setGeometry(QRect(285, 90, 41, 21)) - self.lineEdit_j3 = QLineEdit(self.frame_7) - self.lineEdit_j3.setObjectName(u"lineEdit_j3") - self.lineEdit_j3.setGeometry(QRect(285, 130, 41, 21)) - self.lineEdit_j4 = QLineEdit(self.frame_7) - self.lineEdit_j4.setObjectName(u"lineEdit_j4") - self.lineEdit_j4.setGeometry(QRect(285, 170, 41, 21)) - self.lineEdit_j5 = QLineEdit(self.frame_7) - self.lineEdit_j5.setObjectName(u"lineEdit_j5") - self.lineEdit_j5.setGeometry(QRect(285, 210, 41, 21)) - self.lineEdit_j6 = QLineEdit(self.frame_7) - self.lineEdit_j6.setObjectName(u"lineEdit_j6") - self.lineEdit_j6.setGeometry(QRect(285, 250, 41, 21)) - self.label_j1 = QLabel(self.frame_7) - self.label_j1.setObjectName(u"label_j1") - self.label_j1.setGeometry(QRect(125, 32, 53, 15)) - self.label_j2 = QLabel(self.frame_7) - self.label_j2.setObjectName(u"label_j2") - self.label_j2.setGeometry(QRect(125, 70, 53, 15)) - self.label_j3 = QLabel(self.frame_7) - self.label_j3.setObjectName(u"label_j3") - self.label_j3.setGeometry(QRect(125, 110, 53, 15)) - self.label_j4 = QLabel(self.frame_7) - self.label_j4.setObjectName(u"label_j4") - self.label_j4.setGeometry(QRect(125, 150, 53, 15)) - self.label_j5 = QLabel(self.frame_7) - self.label_j5.setObjectName(u"label_j5") - self.label_j5.setGeometry(QRect(125, 190, 53, 15)) - self.label_j6 = QLabel(self.frame_7) - self.label_j6.setObjectName(u"label_j6") - self.label_j6.setGeometry(QRect(125, 230, 53, 15)) - self.lineEdit_manual_adjust_accuracy = QLineEdit(self.frame_7) - self.lineEdit_manual_adjust_accuracy.setObjectName(u"lineEdit_manual_adjust_accuracy") - self.lineEdit_manual_adjust_accuracy.setGeometry(QRect(110, 10, 61, 21)) - self.label_manual_adjust_accuracy = QLabel(self.frame_7) - self.label_manual_adjust_accuracy.setObjectName(u"label_manual_adjust_accuracy") - self.label_manual_adjust_accuracy.setGeometry(QRect(50, 13, 53, 15)) - self.tabWidget_control.addTab(self.tab_5, "") - self.frame_sign = QFrame(self.frame_6) - self.frame_sign.setObjectName(u"frame_sign") - self.frame_sign.setGeometry(QRect(10, 10, 121, 121)) - self.frame_sign.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);") - self.frame_sign.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_sign.setFrameShadow(QFrame.Shadow.Raised) - self.pushButton_sign_go = QPushButton(self.frame_sign) - self.pushButton_sign_go.setObjectName(u"pushButton_sign_go") - self.pushButton_sign_go.setGeometry(QRect(10, 20, 10, 10)) - self.pushButton_sign_go.setStyleSheet(u"*{\n" -"background-color: #7A7A7A;\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - self.label_sign_go = QLabel(self.frame_sign) - self.label_sign_go.setObjectName(u"label_sign_go") - self.label_sign_go.setGeometry(QRect(30, 15, 71, 20)) - self.label_sign_go.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color:#7A7A7A;") - self.label_sign_go.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - self.label_sign_photo = QLabel(self.frame_sign) - self.label_sign_photo.setObjectName(u"label_sign_photo") - self.label_sign_photo.setGeometry(QRect(30, 39, 61, 20)) - self.label_sign_photo.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color: red;") - self.label_sign_photo.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - self.pushButton_sign_photo = QPushButton(self.frame_sign) - self.pushButton_sign_photo.setObjectName(u"pushButton_sign_photo") - self.pushButton_sign_photo.setGeometry(QRect(10, 44, 10, 10)) - self.pushButton_sign_photo.setStyleSheet(u"*{\n" -"background-color: rgb(255, 0, 0);\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - self.label_sign_feed = QLabel(self.frame_sign) - self.label_sign_feed.setObjectName(u"label_sign_feed") - self.label_sign_feed.setGeometry(QRect(30, 89, 61, 20)) - self.label_sign_feed.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color: black;") - self.label_sign_feed.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - self.pushButton_sign_take = QPushButton(self.frame_sign) - self.pushButton_sign_take.setObjectName(u"pushButton_sign_take") - self.pushButton_sign_take.setGeometry(QRect(10, 70, 10, 10)) - self.pushButton_sign_take.setStyleSheet(u"*{\n" -"background-color: rgb(255, 0, 0);\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - self.label_sign_take = QLabel(self.frame_sign) - self.label_sign_take.setObjectName(u"label_sign_take") - self.label_sign_take.setGeometry(QRect(30, 65, 61, 20)) - self.label_sign_take.setStyleSheet(u"background-color: rgba(255, 255, 255, 0);\n" -"font: 700 12pt \"Microsoft YaHei UI\";\n" -"color: black;") - self.label_sign_take.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter) - self.pushButton_sign_feed = QPushButton(self.frame_sign) - self.pushButton_sign_feed.setObjectName(u"pushButton_sign_feed") - self.pushButton_sign_feed.setGeometry(QRect(10, 94, 10, 10)) - self.pushButton_sign_feed.setStyleSheet(u"*{\n" -"background-color: rgb(255, 0, 0);\n" -"font: 9pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 5px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #ff6e00;\n" -"}\n" -"\n" -"") - self.label_status_model = QLabel(self.frame_6) - self.label_status_model.setObjectName(u"label_status_model") - self.label_status_model.setGeometry(QRect(320, 530, 81, 21)) - self.label_status_model.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - self.label_5 = QLabel(self.frame_6) - self.label_5.setObjectName(u"label_5") - self.label_5.setGeometry(QRect(240, 530, 81, 16)) - self.label_5.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.label_status_remoteCmdLen = QLabel(self.frame_6) - self.label_status_remoteCmdLen.setObjectName(u"label_status_remoteCmdLen") - self.label_status_remoteCmdLen.setGeometry(QRect(550, 530, 81, 21)) - self.label_status_remoteCmdLen.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: #black; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - self.label_4 = QLabel(self.frame_6) - self.label_4.setObjectName(u"label_4") - self.label_4.setGeometry(QRect(430, 532, 111, 16)) - self.stackedWidget_feed.addWidget(self.page_6) - self.page_7 = QWidget() - self.page_7.setObjectName(u"page_7") - self.tableWidget_feedSeting = QTableWidget(self.page_7) - self.tableWidget_feedSeting.setObjectName(u"tableWidget_feedSeting") - self.tableWidget_feedSeting.setGeometry(QRect(10, 50, 871, 191)) - self.pushButton_tableFeedSet_addRow = QPushButton(self.page_7) - self.pushButton_tableFeedSet_addRow.setObjectName(u"pushButton_tableFeedSet_addRow") - self.pushButton_tableFeedSet_addRow.setGeometry(QRect(710, 10, 75, 31)) - self.pushButton_tableFeedSet_addRow.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - self.pushButton_tableFeedSet_deleRow = QPushButton(self.page_7) - self.pushButton_tableFeedSet_deleRow.setObjectName(u"pushButton_tableFeedSet_deleRow") - self.pushButton_tableFeedSet_deleRow.setGeometry(QRect(790, 10, 75, 31)) - self.pushButton_tableFeedSet_deleRow.setStyleSheet(u"*{\n" -"color: #ffffff;\n" -"background-color: #FF5722;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #499c8a;\n" -"}\n" -"") - self.pushButton_tableFeedSet_save = QPushButton(self.page_7) - self.pushButton_tableFeedSet_save.setObjectName(u"pushButton_tableFeedSet_save") - self.pushButton_tableFeedSet_save.setGeometry(QRect(630, 10, 75, 31)) - self.pushButton_tableFeedSet_save.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.frame_4 = QFrame(self.page_7) - self.frame_4.setObjectName(u"frame_4") - self.frame_4.setGeometry(QRect(10, 240, 871, 211)) - self.frame_4.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_4.setFrameShadow(QFrame.Shadow.Raised) - self.frame_5 = QFrame(self.frame_4) - self.frame_5.setObjectName(u"frame_5") - self.frame_5.setGeometry(QRect(0, 10, 871, 131)) - self.frame_5.setFrameShape(QFrame.Shape.StyledPanel) - self.frame_5.setFrameShadow(QFrame.Shadow.Raised) - self.label_3 = QLabel(self.frame_5) - self.label_3.setObjectName(u"label_3") - self.label_3.setGeometry(QRect(20, 20, 53, 15)) - self.label_3.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.lineEdit_x1 = QLineEdit(self.frame_5) - self.lineEdit_x1.setObjectName(u"lineEdit_x1") - self.lineEdit_x1.setGeometry(QRect(80, 20, 91, 21)) - self.lineEdit_x1.setReadOnly(True) - self.lineEdit_y1 = QLineEdit(self.frame_5) - self.lineEdit_y1.setObjectName(u"lineEdit_y1") - self.lineEdit_y1.setGeometry(QRect(290, 20, 91, 21)) - self.lineEdit_y1.setReadOnly(True) - self.label_7 = QLabel(self.frame_5) - self.label_7.setObjectName(u"label_7") - self.label_7.setGeometry(QRect(230, 20, 53, 15)) - self.label_7.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.lineEdit_z1 = QLineEdit(self.frame_5) - self.lineEdit_z1.setObjectName(u"lineEdit_z1") - self.lineEdit_z1.setGeometry(QRect(480, 20, 91, 21)) - self.lineEdit_z1.setReadOnly(True) - self.label_8 = QLabel(self.frame_5) - self.label_8.setObjectName(u"label_8") - self.label_8.setGeometry(QRect(420, 20, 53, 15)) - self.label_8.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.lineEdit_y2 = QLineEdit(self.frame_5) - self.lineEdit_y2.setObjectName(u"lineEdit_y2") - self.lineEdit_y2.setGeometry(QRect(290, 50, 91, 21)) - self.lineEdit_y2.setReadOnly(True) - self.lineEdit_x2 = QLineEdit(self.frame_5) - self.lineEdit_x2.setObjectName(u"lineEdit_x2") - self.lineEdit_x2.setGeometry(QRect(80, 50, 91, 21)) - self.lineEdit_x2.setReadOnly(True) - self.label_9 = QLabel(self.frame_5) - self.label_9.setObjectName(u"label_9") - self.label_9.setGeometry(QRect(230, 50, 53, 15)) - self.label_9.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.label_10 = QLabel(self.frame_5) - self.label_10.setObjectName(u"label_10") - self.label_10.setGeometry(QRect(420, 50, 53, 15)) - self.label_10.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.label_11 = QLabel(self.frame_5) - self.label_11.setObjectName(u"label_11") - self.label_11.setGeometry(QRect(20, 50, 53, 15)) - self.label_11.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.lineEdit_z2 = QLineEdit(self.frame_5) - self.lineEdit_z2.setObjectName(u"lineEdit_z2") - self.lineEdit_z2.setGeometry(QRect(480, 50, 91, 21)) - self.lineEdit_z2.setReadOnly(True) - self.lineEdit_z3 = QLineEdit(self.frame_5) - self.lineEdit_z3.setObjectName(u"lineEdit_z3") - self.lineEdit_z3.setGeometry(QRect(480, 80, 91, 21)) - self.lineEdit_z3.setReadOnly(True) - self.lineEdit_x3 = QLineEdit(self.frame_5) - self.lineEdit_x3.setObjectName(u"lineEdit_x3") - self.lineEdit_x3.setGeometry(QRect(80, 80, 91, 21)) - self.lineEdit_x3.setReadOnly(True) - self.label_12 = QLabel(self.frame_5) - self.label_12.setObjectName(u"label_12") - self.label_12.setGeometry(QRect(420, 80, 53, 15)) - self.label_12.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.lineEdit_y3 = QLineEdit(self.frame_5) - self.lineEdit_y3.setObjectName(u"lineEdit_y3") - self.lineEdit_y3.setGeometry(QRect(290, 80, 91, 21)) - self.lineEdit_y3.setReadOnly(True) - self.label_13 = QLabel(self.frame_5) - self.label_13.setObjectName(u"label_13") - self.label_13.setGeometry(QRect(20, 80, 53, 15)) - self.label_13.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.label_14 = QLabel(self.frame_5) - self.label_14.setObjectName(u"label_14") - self.label_14.setGeometry(QRect(230, 80, 53, 15)) - self.label_14.setAlignment(Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignTrailing|Qt.AlignmentFlag.AlignVCenter) - self.pushButton_get_p1 = QPushButton(self.frame_5) - self.pushButton_get_p1.setObjectName(u"pushButton_get_p1") - self.pushButton_get_p1.setGeometry(QRect(594, 20, 81, 23)) - self.pushButton_get_p1.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.pushButton_get_p2 = QPushButton(self.frame_5) - self.pushButton_get_p2.setObjectName(u"pushButton_get_p2") - self.pushButton_get_p2.setGeometry(QRect(594, 50, 81, 23)) - self.pushButton_get_p2.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.pushButton_get_p3 = QPushButton(self.frame_5) - self.pushButton_get_p3.setObjectName(u"pushButton_get_p3") - self.pushButton_get_p3.setGeometry(QRect(594, 80, 81, 23)) - self.pushButton_get_p3.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: rgb(16, 133, 255);\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.pushButton_set_p3 = QPushButton(self.frame_5) - self.pushButton_set_p3.setObjectName(u"pushButton_set_p3") - self.pushButton_set_p3.setGeometry(QRect(680, 80, 81, 23)) - self.pushButton_set_p3.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.pushButton_set_p1 = QPushButton(self.frame_5) - self.pushButton_set_p1.setObjectName(u"pushButton_set_p1") - self.pushButton_set_p1.setGeometry(QRect(680, 20, 81, 23)) - self.pushButton_set_p1.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.pushButton_set_p2 = QPushButton(self.frame_5) - self.pushButton_set_p2.setObjectName(u"pushButton_set_p2") - self.pushButton_set_p2.setGeometry(QRect(680, 50, 81, 23)) - self.pushButton_set_p2.setStyleSheet(u"\n" -"*{\n" -"color: #ffffff;\n" -"background-color: #1AA094;\n" -"font: 12pt \"\u6977\u4f53\";\n" -"border: 1px solid #dcdfe6;\n" -"border-radius: 6px;\n" -"}\n" -"*:pressed\n" -"{\n" -"background-color: #197971;\n" -"}\n" -"") - self.stackedWidget_feed.addWidget(self.page_7) - self.tabWidget.addTab(self.tab, "") - self.tab_2 = QWidget() - self.tab_2.setObjectName(u"tab_2") - self.pushButton_2 = QPushButton(self.tab_2) - self.pushButton_2.setObjectName(u"pushButton_2") - self.pushButton_2.setGeometry(QRect(10, 10, 75, 23)) - self.pushButton = QPushButton(self.tab_2) - self.pushButton.setObjectName(u"pushButton") - self.pushButton.setGeometry(QRect(10, 39, 75, 23)) - self.tabWidget.addTab(self.tab_2, "") - self.label_date = QLabel(self.centralwidget) - self.label_date.setObjectName(u"label_date") - self.label_date.setGeometry(QRect(690, 640, 91, 16)) - self.label_date.setStyleSheet(u"color:#fff;\n" -"font: 290 9pt \"Microsoft YaHei\";\n" -"font: 700 9pt \"Microsoft YaHei UI\";") - self.label_date.setAlignment(Qt.AlignmentFlag.AlignCenter) - self.frame = QFrame(self.centralwidget) - self.frame.setObjectName(u"frame") - self.frame.setGeometry(QRect(300, 634, 301, 28)) - self.frame.setStyleSheet(u"background-color: #9A9A9A;") - self.frame.setFrameShape(QFrame.Shape.StyledPanel) - self.frame.setFrameShadow(QFrame.Shadow.Raised) - self.label = QLabel(self.frame) - self.label.setObjectName(u"label") - self.label.setGeometry(QRect(20, 7, 81, 16)) - self.label.setStyleSheet(u"color: #F9FFF9;\n" -"font: 700 9pt \"\u7b49\u7ebf\";") - self.label_connect_status = QLabel(self.frame) - self.label_connect_status.setObjectName(u"label_connect_status") - self.label_connect_status.setGeometry(QRect(220, 7, 16, 16)) - self.label_connect_status.setStyleSheet(u"QLabel {\n" -" background-color: #A2EF4D; /* \u8bbe\u7f6e\u80cc\u666f\u989c\u8272 */\n" -" color: #ffffff; /* \u8bbe\u7f6e\u5b57\u4f53\u989c\u8272 */\n" -" border-radius: 8px; /* \u5706\u89d2\u534a\u5f84\u8bbe\u7f6e\u4e3a QLabel \u7684\u4e00\u534a\uff0c\u5f62\u6210\u5706\u5f62 */\n" -" border: 1px solid #A2EF4D; /* \u8bbe\u7f6e\u8fb9\u6846\u989c\u8272\u548c\u5bbd\u5ea6 */\n" -" qproperty-alignment: 'AlignCenter'; /* \u8bbe\u7f6e\u6587\u672c\u5c45\u4e2d */\n" -"}\n" -"") - self.label_6 = QLabel(self.frame) - self.label_6.setObjectName(u"label_6") - self.label_6.setGeometry(QRect(160, 7, 51, 16)) - self.label_6.setStyleSheet(u"color: #F9FFF9;\n" -"font: 700 9pt \"\u7b49\u7ebf\";") - MainWindow.setCentralWidget(self.centralwidget) - self.tabWidget.raise_() - self.label_time.raise_() - self.label_date.raise_() - self.frame.raise_() - - self.retranslateUi(MainWindow) - - self.tabWidget.setCurrentIndex(0) - self.stackedWidget_feed.setCurrentIndex(0) - self.stackedWidget_num.setCurrentIndex(0) - self.tabWidget_2.setCurrentIndex(1) - self.tabWidget_control.setCurrentIndex(0) - - - QMetaObject.connectSlotsByName(MainWindow) - # setupUi - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u81ea\u52a8\u5316\u5bc6\u80fa\u751f\u4ea7", None)) - self.label_time.setText(QCoreApplication.translate("MainWindow", u"08:00:00", None)) - self.pushButton_stack_feedControl.setText(QCoreApplication.translate("MainWindow", u"\u76d1\u63a7\u6295\u6599", None)) - self.pushButton_stack_feedSet.setText(QCoreApplication.translate("MainWindow", u"\u6295\u6599\u8bbe\u7f6e", None)) - self.pushButton_8.setText(QCoreApplication.translate("MainWindow", u"IO\u8c03\u8bd5", None)) - self.label_showDetection.setText("") - self.label_maxNum.setText(QCoreApplication.translate("MainWindow", u"10", None)) - self.comboBox_lineIndex.setItemText(0, QCoreApplication.translate("MainWindow", u"1\u53f7\u7ebf", None)) - self.comboBox_lineIndex.setItemText(1, QCoreApplication.translate("MainWindow", u"\u65b0\u5efa\u7ebf", None)) - - self.comboBox_lineIndex.setCurrentText(QCoreApplication.translate("MainWindow", u"1\u53f7\u7ebf", None)) - self.pushButton_num5.setText(QCoreApplication.translate("MainWindow", u"50", None)) - self.pushButton_num1.setText(QCoreApplication.translate("MainWindow", u"10", None)) - self.pushButton_num6.setText(QCoreApplication.translate("MainWindow", u"60", None)) - self.pushButton_num3.setText(QCoreApplication.translate("MainWindow", u"30", None)) - self.pushButton_num4.setText(QCoreApplication.translate("MainWindow", u"40", None)) - self.pushButton_num_free.setText(QCoreApplication.translate("MainWindow", u"\u81ea\u5b9a\u4e49", None)) - self.pushButton_num2.setText(QCoreApplication.translate("MainWindow", u"20", None)) - self.lineEdit_num.setText("") - self.lineEdit_num.setPlaceholderText(QCoreApplication.translate("MainWindow", u"0-100", None)) - self.pushButton_AddNum.setText(QCoreApplication.translate("MainWindow", u"\u8865\u4e00\u888b", None)) - self.pushButton_SubNum.setText(QCoreApplication.translate("MainWindow", u"\u6263\u4e00\u888b", None)) - self.lineEdit_speed.setText(QCoreApplication.translate("MainWindow", u"10", None)) - self.lineEdit_speed.setPlaceholderText(QCoreApplication.translate("MainWindow", u"\u8f93\u5165\u6574\u6570\uff0c\u5207\u52ff\u8d85\u901f", None)) - self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u81ea\u52a8\u901f\u5ea6\uff1a", None)) - self.pushButton_speed.setText(QCoreApplication.translate("MainWindow", u"PushButton", None)) - self.textEdit_log_info.setHtml(QCoreApplication.translate("MainWindow", u"\n" -"\n" -"