Files
AutoControlSystem-git/app.py
2024-09-04 23:20:47 +08:00

390 lines
17 KiB
Python

import configparser
import json
import queue
import sys
from multiprocessing import Process
from PySide6.QtCore import QThread, Signal, Slot
from PySide6.QtGui import QIntValidator, QStandardItemModel, QStandardItem, Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
from datetime import datetime
from CU.Command import FeedCommand
from CU.Feeding import FeedLine, FeedingConfig, Feeding, FeedStatus
from Vision.camera_coordinate_dete import Detection
from ui_untitled import Ui_MainWindow
from COM.COM_Robot import RobotClient
from Expection import Error_Code
from queue import Queue
from Model.RobotModel import *
import time
from queue import Queue
from Model.Position import Real_Position, Detection_Position
from threading import Thread
from CU.Command import Status
class MainWindow(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.init_UI()
self.init_Run()
self.init_robot_info()
self.init_FeedLine()
self.start_Runing()
def init_UI(self):
self.horizontalSlider_J1.sliderReleased.connect(self.slider_valueChanged)
self.horizontalSlider_J2.sliderReleased.connect(self.slider_valueChanged)
self.horizontalSlider_J3.sliderReleased.connect(self.slider_valueChanged)
self.horizontalSlider_J4.sliderReleased.connect(self.slider_valueChanged)
self.horizontalSlider_J5.sliderReleased.connect(self.slider_valueChanged)
self.horizontalSlider_J6.sliderReleased.connect(self.slider_valueChanged)
self.pushButton_num1.clicked.connect(self.send_num_button_click)
self.pushButton_num2.clicked.connect(self.send_num_button_click)
self.pushButton_num3.clicked.connect(self.send_num_button_click)
self.pushButton_num4.clicked.connect(self.send_num_button_click)
self.pushButton_num5.clicked.connect(self.send_num_button_click)
self.pushButton_num6.clicked.connect(self.send_num_button_click)
self.pushButton_AddNum.clicked.connect(self.send_addNum_button_click)
self.pushButton_SubNum.clicked.connect(self.send_subNum_button_click)
self.pushButton_num_free.clicked.connect(self.send_num_button_click)
self.lineEdit_j1.returnPressed.connect(self.send_position_returnPressed)
self.lineEdit_j2.returnPressed.connect(self.send_position_returnPressed)
self.lineEdit_j3.returnPressed.connect(self.send_position_returnPressed)
self.lineEdit_j4.returnPressed.connect(self.send_position_returnPressed)
self.lineEdit_j5.returnPressed.connect(self.send_position_returnPressed)
self.lineEdit_j6.returnPressed.connect(self.send_position_returnPressed)
self.lineEdit_num.returnPressed.connect(self.send_custom_num_returnPressed)
int_validator = QIntValidator(0, 100, self.lineEdit_num)
self.lineEdit_num.setValidator(int_validator)
# self.horizontalSlider_J1.sliderReleased
self.pushButton_startFeed.clicked.connect(self.send_startFeed_button_click)
self.pushButton_stack_feedSet.clicked.connect(self.send_stack_feedSet_button_click)
self.horizontalSlider_feedingNum.setMinimum(0)
model = QStandardItemModel(4, 6, self) # 4行6列
# 设置第一层表头
model.setHorizontalHeaderLabels(['', '个人信息', '', '', '工作信息', ''])
# 设置第二层表头
itemA = QStandardItem("x")
itemA.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
model.setItem(0, 0, itemA)
model.setItem(0, 1, QStandardItem("y"))
model.setItem(0, 2, QStandardItem("z"))
model.setItem(0, 3, QStandardItem("u"))
model.setItem(0, 4, QStandardItem("v"))
model.setItem(0, 5, QStandardItem("w"))
# 填充表格数据
data = [
["Alice", "25", "New York", "Developer", "ABC Corp", "$100,000"],
["Bob", "30", "Los Angeles", "Designer", "XYZ Ltd", "$90,000"],
["Charlie", "22", "Chicago", "Analyst", "MNO Inc", "$80,000"],
["David", "28", "Miami", "Manager", "PQR LLC", "$110,000"]
]
for row_idx, row_data in enumerate(data):
for col_idx, item in enumerate(row_data):
model.setItem(row_idx + 1, col_idx, QStandardItem(item))
# 合并单元格以创建多级表头效果
self.tableView_feedSeting.setSpan(0, 0, 1, 3) # "个人信息" 跨越三列
self.tableView_feedSeting.setSpan(0, 3, 1, 3) # "工作信息" 跨越三列
# 设置模型到表视图
self.tableView_feedSeting.setModel(model)
def init_Run(self):
self.robotClient = None
self.configReader = configparser.ConfigParser()
self.detection = Detection()
self.command_position_quene = Queue()
self.status_address = DataAddress()
self.feedLine_dict = {}
self.command_quene = Queue()
self.main_threading = None
self.configReader.read('Seting.ini')
ip = self.configReader.get('Robot_Feed', 'IPAddress')
port = int(self.configReader.get('Robot_Feed', 'Port'))
self.robotClient = RobotClient(ip, port, self.command_position_quene, self.status_address)
self.feeding = Feeding(self.robotClient,self.detection) # 临时
self.last_time=time.time()
try:
self.robotClient.CreatConnect()
except:
self.set_label_status_style(False)
return Error_Code.SYS_NETERROR
if self.robotClient.connected:
return 0
else:
return Error_Code.SYS_NETERROR
def init_FeedLine(self):
line_count = self.configReader.get('Robot_Feed', 'LineCount', fallback=0)
self.configReader.read('Config/FeedLine.ini')
for i in range(int(line_count)):
line_str = f'FeedLine{i+1}'
safe_position = Real_Position()
photo_position = Real_Position()
feed_position = Real_Position()
safe_position.X = int(self.configReader.get(line_str, 'SafePosition_x', fallback=0))
safe_position.Y = int(self.configReader.get(line_str, 'SafePosition_y', fallback=0))
safe_position.Z = int(self.configReader.get(line_str, 'SafePosition_z', fallback=0))
safe_position.U = int(self.configReader.get(line_str, 'SafePosition_u', fallback=0))
safe_position.V = int(self.configReader.get(line_str, 'SafePosition_v', fallback=0))
safe_position.W = int(self.configReader.get(line_str, 'SafePosition_w', fallback=0))
photo_position.X = int(self.configReader.get(line_str, 'PhotoPosition_x', fallback=0))
photo_position.Y = int(self.configReader.get(line_str, 'PhotoPosition_y', fallback=0))
photo_position.Z = int(self.configReader.get(line_str, 'PhotoPosition_z', fallback=0))
photo_position.U = int(self.configReader.get(line_str, 'PhotoPosition_u', fallback=0))
photo_position.V = int(self.configReader.get(line_str, 'PhotoPosition_v', fallback=0))
photo_position.W = int(self.configReader.get(line_str, 'PhotoPosition_w', fallback=0))
feed_position.X = int(self.configReader.get(line_str, 'FeedPosition_x', fallback=0))
feed_position.Y = int(self.configReader.get(line_str, 'FeedPosition_y', fallback=0))
feed_position.Z = int(self.configReader.get(line_str, 'FeedPosition_z', fallback=0))
feed_position.U = int(self.configReader.get(line_str, 'FeedPosition_u', fallback=0))
feed_position.V = int(self.configReader.get(line_str, 'FeedPosition_v', fallback=0))
feed_position.W = int(self.configReader.get(line_str, 'FeedPosition_w', fallback=0))
self.feedLine_dict[str(i+1)] = FeedLine(safe_position, photo_position, feed_position)
pass
def init_robot_info(self):
j1_min = int(self.configReader.get('Robot_Feed', 'j1_min'))
j1_max = int(self.configReader.get('Robot_Feed', 'j1_max'))
j2_min = int(self.configReader.get('Robot_Feed', 'j2_min'))
j2_max = int(self.configReader.get('Robot_Feed', 'j2_max'))
j3_min = int(self.configReader.get('Robot_Feed', 'j3_min'))
j3_max = int(self.configReader.get('Robot_Feed', 'j3_max'))
j4_min = int(self.configReader.get('Robot_Feed', 'j4_min'))
j4_max = int(self.configReader.get('Robot_Feed', 'j4_max'))
j5_min = int(self.configReader.get('Robot_Feed', 'j5_min'))
j5_max = int(self.configReader.get('Robot_Feed', 'j5_max'))
j6_min = int(self.configReader.get('Robot_Feed', 'j6_min'))
j6_max = int(self.configReader.get('Robot_Feed', 'j6_max'))
self.horizontalSlider_J1.setMinimum(j1_min)
self.horizontalSlider_J1.setMaximum(j1_max)
self.horizontalSlider_J2.setMinimum(j2_min)
self.horizontalSlider_J2.setMaximum(j2_max)
self.horizontalSlider_J3.setMinimum(j3_min)
self.horizontalSlider_J3.setMaximum(j3_max)
self.horizontalSlider_J4.setMinimum(j4_min)
self.horizontalSlider_J4.setMaximum(j4_max)
self.horizontalSlider_J5.setMinimum(j5_min)
self.horizontalSlider_J5.setMaximum(j5_max)
self.horizontalSlider_J6.setMinimum(j6_min)
self.horizontalSlider_J6.setMaximum(j6_max)
self.label_j1_min.setText(j1_min.__str__())
self.label_j1_max.setText(j1_max.__str__())
self.label_j2_min.setText(j2_min.__str__())
self.label_j2_max.setText(j2_max.__str__())
self.label_j3_min.setText(j3_min.__str__())
self.label_j3_max.setText(j3_max.__str__())
self.label_j4_min.setText(j4_min.__str__())
self.label_j4_max.setText(j4_max.__str__())
self.label_j5_min.setText(j5_min.__str__())
self.label_j5_max.setText(j5_max.__str__())
self.label_j6_min.setText(j6_min.__str__())
self.label_j6_max.setText(str(j6_max))
def start_Runing(self):
self.main_threading = Thread(target=self.run)
self.robot_connect_threading = Thread(target=self.robotClient.run)
self.main_threading.start()
self.robot_connect_threading.start()
pass
def send_startFeed_button_click(self):
num = self.horizontalSlider_feedingNum.maximum()
line_index = str(self.comboBox_lineIndex.currentIndex()+1)
self.command_quene.put(FeedCommand(FeedingConfig(num, self.feedLine_dict[line_index])))
self.stackedWidget_num.setCurrentIndex(1)
def send_num_button_click(self):
button = self.sender()
if button.text() != "自定义":
num = int(button.text())
self.horizontalSlider_feedingNum.setMaximum(num)
self.label_maxNum.setText(str(num))
self.horizontalSlider_feedingNum.setValue(0)
else:
self.pushButton_num_free.hide()
def send_addNum_button_click(self):
self.feeding.feedConfig.num +=1
def send_subNum_button_click(self):
self.feeding.feedConfig.num -=1
def send_custom_num_returnPressed(self):
self.pushButton_num_free.show()
self.lineEdit_num.hide()
self.horizontalSlider_feedingNum.setMaximum(int(self.lineEdit_num.text()))
self.horizontalSlider_feedingNum.setValue(0)
self.label_maxNum.setText(self.lineEdit_num.text())
def send_stack_feedSet_button_click(self):
self.stackedWidget_feed.setCurrentIndex(1)
def slider_valueChanged(self):
now_time = time.time()
if(now_time-self.last_time) < 2:
return
self.last_time = now_time
position_instruction = Instruction()
position_instruction.m0 = self.horizontalSlider_J1.value()
position_instruction.m1 = self.horizontalSlider_J2.value()
position_instruction.m2 = self.horizontalSlider_J3.value()
position_instruction.m3 = self.horizontalSlider_J4.value()
position_instruction.m4 = self.horizontalSlider_J5.value()
position_instruction.m5 = self.horizontalSlider_J6.value()
self.lineEdit_j1.setText(str(self.horizontalSlider_J1.value()))
self.lineEdit_j2.setText(str(self.horizontalSlider_J2.value()))
self.lineEdit_j3.setText(str(self.horizontalSlider_J3.value()))
self.lineEdit_j4.setText(str(self.horizontalSlider_J4.value()))
self.lineEdit_j5.setText(str(self.horizontalSlider_J5.value()))
self.lineEdit_j6.setText(str(self.horizontalSlider_J6.value()))
instruction_command = CMDInstructRequest()
instruction_command.instructions.append(position_instruction)
request_command = instruction_command.toString()
print(request_command)
self.robotClient.add_sendQuene(request_command)
def on_button_click(self):
self.button.setText("Clicked!")
def send_position_button_click(self):
# if True:
# cmd_command = CMDRequest()
# cmd_command.cmdData = ['rewriteData', '800', f'{position_instruction.m0}', 0]
# request_command = vars(cmd_command)
# self.robotClient.add_sendQuene(request_command)
return
def send_position_returnPressed(self):
position_instruction = Instruction()
position_instruction.m0 = int(self.lineEdit_j1.text())
position_instruction.m1 = int(self.lineEdit_j2.text())
position_instruction.m2 = int(self.lineEdit_j3.text())
position_instruction.m3 = int(self.lineEdit_j4.text())
position_instruction.m4 = int(self.lineEdit_j5.text())
position_instruction.m5 = int(self.lineEdit_j6.text())
self.horizontalSlider_J1.setValue(int(self.lineEdit_j1.text()))
self.horizontalSlider_J2.setValue(int(self.lineEdit_j2.text()))
self.horizontalSlider_J3.setValue(int(self.lineEdit_j3.text()))
self.horizontalSlider_J4.setValue(int(self.lineEdit_j4.text()))
self.horizontalSlider_J5.setValue(int(self.lineEdit_j5.text()))
self.horizontalSlider_J6.setValue(int(self.lineEdit_j6.text()))
instruction_command = CMDInstructRequest()
instruction_command.instructions.append(position_instruction)
request_command = instruction_command.toString()
print(request_command)
self.robotClient.add_sendQuene(request_command)
def run(self):
while True:
time.sleep(0.2)
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)
if self.horizontalSlider_feedingNum.value() == 0:
self.stackedWidget_num.setCurrentIndex(0)
else:
self.stackedWidget_num.setCurrentIndex(1)
self.label_date.setText(datetime.now().strftime("%Y-%m-%d"))
self.label_time.setText(datetime.now().strftime("%H:%M:%S"))
self.updateUI_Position()
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)
def set_label_status_style(self, connected: bool):
if connected:
self.label_connect_status.setStyleSheet("""
QLabel {
background-color: #A2EF4D; /* 设置背景颜色 */
color: #ffffff; /* 设置字体颜色 */
border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */
border: 1px solid #A2EF4D; /* 设置边框颜色和宽度 */
qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */
}
""")
else:
self.label_connect_status.setStyleSheet("""
QLabel {
background-color: #FD3251; /* 设置背景颜色 */
color: #ffffff; /* 设置字体颜色 */
border-radius: 8px; /* 圆角半径设置为 QLabel 的一半,形成圆形 */
border: 1px solid #FD3251; /* 设置边框颜色和宽度 */
qproperty-alignment: 'AlignCenter'; /* 设置文本居中 */
}
""")
def send_position_command(self, position):
self.robotClient.add_sendQuene(position)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())