721 lines
34 KiB
Python
721 lines
34 KiB
Python
import configparser
|
||
import json
|
||
import logging
|
||
import queue
|
||
import sys
|
||
from multiprocessing import Process
|
||
|
||
from PyQt5.uic.properties import QtWidgets
|
||
from PySide6.QtCore import QThread, Signal, Slot, QObject, QEvent
|
||
from PySide6.QtGui import QIntValidator, QStandardItemModel, QStandardItem, Qt
|
||
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHeaderView, QTableWidget, \
|
||
QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox
|
||
from datetime import datetime
|
||
from Util.util_ini import writeFeedLine_to_ini
|
||
import Constant
|
||
from CU.Command import FeedCommand
|
||
from CU.Feeding import FeedLine, FeedingConfig, Feeding, FeedStatus
|
||
from Util.util_log import QTextEditLogger
|
||
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()
|
||
self.init_log()
|
||
|
||
def init_log(self):
|
||
|
||
self.logger_textEdit = logging.getLogger("QTextEditLogger")
|
||
self.logger_textEdit.setLevel(logging.DEBUG)
|
||
|
||
text_edit_handler = QTextEditLogger(self.textEdit_log_info)
|
||
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
|
||
text_edit_handler.setFormatter(formatter)
|
||
self.logger_textEdit.addHandler(text_edit_handler)
|
||
|
||
def init_UI(self):
|
||
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.pushButton_j1_sub.clicked.connect(self.send_subOneAsix_button_click)
|
||
self.pushButton_j2_sub.clicked.connect(self.send_subOneAsix_button_click)
|
||
self.pushButton_j3_sub.clicked.connect(self.send_subOneAsix_button_click)
|
||
self.pushButton_j4_sub.clicked.connect(self.send_subOneAsix_button_click)
|
||
self.pushButton_j5_sub.clicked.connect(self.send_subOneAsix_button_click)
|
||
self.pushButton_j6_sub.clicked.connect(self.send_subOneAsix_button_click)
|
||
|
||
self.pushButton_j1_add.clicked.connect(self.send_addOneAsix_button_click)
|
||
self.pushButton_j2_add.clicked.connect(self.send_addOneAsix_button_click)
|
||
self.pushButton_j3_add.clicked.connect(self.send_addOneAsix_button_click)
|
||
self.pushButton_j4_add.clicked.connect(self.send_addOneAsix_button_click)
|
||
self.pushButton_j5_add.clicked.connect(self.send_addOneAsix_button_click)
|
||
self.pushButton_j6_add.clicked.connect(self.send_addOneAsix_button_click)
|
||
|
||
self.pushButton_stopFeed.clicked.connect(self.send_stopFeed_button_click)
|
||
self.pushButton_pauseFeed.clicked.connect(self.send_pauseFeed_button_click)
|
||
|
||
self.pushButton_clearAlarm.clicked.connect(self.send_clear_alarm_command)
|
||
|
||
self.pushButton_speed.setText(str(Constant.speed))
|
||
self.pushButton_speed.clicked.connect(self.send_setSpeed_label_doubelClick)
|
||
self.lineEdit_speed.returnPressed.connect(self.send_setSpeed_lineEdit_returePressed)
|
||
|
||
|
||
|
||
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_feedControl.clicked.connect(lambda _, index=0: self.send_stack_feedSet_button_click(index))
|
||
self.pushButton_stack_feedSet.clicked.connect(lambda _,index=1:self.send_stack_feedSet_button_click(index))
|
||
|
||
|
||
self.horizontalSlider_feedingNum.blockSignals(True)
|
||
self.horizontalSlider_feedingNum.setMinimum(0)
|
||
|
||
|
||
self.lineEdit_speed.hide()
|
||
self.pushButton_stopFeed.hide()
|
||
self.pushButton_pauseFeed.hide()
|
||
|
||
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(Constant.set_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_seting_frame(self):
|
||
|
||
rows = len(self.feedLine_dict.keys())+1
|
||
self.tableWidget_feedSeting.setRowCount(rows)
|
||
self.tableWidget_feedSeting.setColumnCount(19)
|
||
# 设置第一重表头的合并 (三列一组)
|
||
self.tableWidget_feedSeting_addtional_col_num = 2
|
||
|
||
self.tableWidget_feedSeting.setSpan(0, 0+self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并前3列
|
||
self.tableWidget_feedSeting.setSpan(0, 6+self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并后3列
|
||
self.tableWidget_feedSeting.setSpan(0, 12+self.tableWidget_feedSeting_addtional_col_num, 1, 6) # 合并后3列
|
||
self.tableWidget_feedSeting.itemChanged.connect(self.send_tabelFeedSet_itemChanged)
|
||
|
||
|
||
btn_safe = QPushButton("获取安全位置")
|
||
|
||
widget_safe = QWidget()
|
||
layout_safe = QHBoxLayout()
|
||
layout_safe.addWidget(btn_safe)
|
||
# 调整布局的间距,使之更紧凑
|
||
layout_safe.setContentsMargins(0, 0, 0, 0)
|
||
# 将布局设置到 QWidget 容器中
|
||
widget_safe.setLayout(layout_safe)
|
||
|
||
btn_photo = QPushButton("获取拍照位置")
|
||
widget_photo = QWidget()
|
||
layout_photo = QHBoxLayout()
|
||
layout_photo.addWidget(btn_photo)
|
||
# 调整布局的间距,使之更紧凑
|
||
layout_photo.setContentsMargins(0, 0, 0, 0)
|
||
# 将布局设置到 QWidget 容器中
|
||
widget_photo.setLayout(layout_photo)
|
||
|
||
|
||
btn_feed = QPushButton("获取投料位置")
|
||
widget_feed = QWidget()
|
||
layout_feed = QHBoxLayout()
|
||
layout_feed.addWidget(btn_feed)
|
||
# 调整布局的间距,使之更紧凑
|
||
layout_feed.setContentsMargins(0, 0, 0, 0)
|
||
# 将布局设置到 QWidget 容器中
|
||
widget_feed.setLayout(layout_feed)
|
||
|
||
|
||
btn_safe.clicked.connect(self.send_get_safe_position_button_click)
|
||
btn_photo.clicked.connect(self.send_get_photo_position_button_click)
|
||
btn_feed.clicked.connect(self.send_get_feed_position_button_click)
|
||
# 添加第一重表头项
|
||
|
||
self.tableWidget_feedSeting.setCellWidget(0, 0+self.tableWidget_feedSeting_addtional_col_num, widget_safe)
|
||
self.tableWidget_feedSeting.setCellWidget(0, 6+self.tableWidget_feedSeting_addtional_col_num, widget_photo)
|
||
self.tableWidget_feedSeting.setCellWidget(0, 12+self.tableWidget_feedSeting_addtional_col_num, widget_feed) # 设置在合并的第2组
|
||
|
||
self.tableWidget_feedSeting.setSelectionBehavior(QTableWidget.SelectRows)
|
||
self.tableWidget_feedSeting.setAutoScroll(True)
|
||
# 添加第二重表头
|
||
self.tableWidget_feedSeting.setHorizontalHeaderLabels(['header','线名','X1','Y1','Z1','U1','V1','W1','X2','Y2','Z2','U2','V2','W2','X3','Y3','Z3','U3','V3','W3'])
|
||
|
||
self.tableWidget_feedSeting.hideColumn(0)
|
||
# 填充数据行
|
||
for row,(feed_line_key,feed_line)in enumerate(self.feedLine_dict.items()):
|
||
self.tableWidget_feedSeting.setItem(row+1, 0, QTableWidgetItem(feed_line_key))
|
||
self.tableWidget_feedSeting.setItem(row+1, 1, QTableWidgetItem(feed_line.name))
|
||
self.set_position_to_tabel(row+1, 0, feed_line.safe_position)
|
||
self.set_position_to_tabel(row+1, 1, feed_line.photo_position)
|
||
self.set_position_to_tabel(row+1, 2, feed_line.feed_position)
|
||
|
||
# 禁用自动表头
|
||
self.tableWidget_feedSeting.verticalHeader().setVisible(True)
|
||
self.pushButton_tableFeedSet_addRow.clicked.connect(self.send_tabelFeedSet_addRow)
|
||
self.pushButton_tableFeedSet_deleRow.clicked.connect(self.send_tabelFeedSet_delRow)
|
||
self.pushButton_tableFeedSet_save.clicked.connect(self.send_tabelFeedSet_save)
|
||
|
||
|
||
def init_FeedLine(self):
|
||
line_count = self.configReader.get('Robot_Feed', 'LineCount', fallback=0)
|
||
self.configReader.read(Constant.feedLine_set_file, encoding='utf-8')
|
||
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 = float(self.configReader.get(line_str, 'SafePosition_x', fallback=0))
|
||
safe_position.Y = float(self.configReader.get(line_str, 'SafePosition_y', fallback=0))
|
||
safe_position.Z = float(self.configReader.get(line_str, 'SafePosition_z', fallback=0))
|
||
safe_position.U = float(self.configReader.get(line_str, 'SafePosition_u', fallback=0))
|
||
safe_position.V = float(self.configReader.get(line_str, 'SafePosition_v', fallback=0))
|
||
safe_position.W = float(self.configReader.get(line_str, 'SafePosition_w', fallback=0))
|
||
|
||
photo_position.X = float(self.configReader.get(line_str, 'PhotoPosition_x', fallback=0))
|
||
photo_position.Y = float(self.configReader.get(line_str, 'PhotoPosition_y', fallback=0))
|
||
photo_position.Z = float(self.configReader.get(line_str, 'PhotoPosition_z', fallback=0))
|
||
photo_position.U = float(self.configReader.get(line_str, 'PhotoPosition_u', fallback=0))
|
||
photo_position.V = float(self.configReader.get(line_str, 'PhotoPosition_v', fallback=0))
|
||
photo_position.W = float(self.configReader.get(line_str, 'PhotoPosition_w', fallback=0))
|
||
|
||
|
||
feed_position.X = float(self.configReader.get(line_str, 'FeedPosition_x', fallback=0))
|
||
feed_position.Y = float(self.configReader.get(line_str, 'FeedPosition_y', fallback=0))
|
||
feed_position.Z = float(self.configReader.get(line_str, 'FeedPosition_z', fallback=0))
|
||
feed_position.U = float(self.configReader.get(line_str, 'FeedPosition_u', fallback=0))
|
||
feed_position.V = float(self.configReader.get(line_str, 'FeedPosition_v', fallback=0))
|
||
feed_position.W = float(self.configReader.get(line_str, 'FeedPosition_w', fallback=0))
|
||
|
||
name = self.configReader.get(line_str, 'Name', fallback='未命名')
|
||
self.feedLine_dict[f'{Constant.feedLine_set_section}{i+1}'] = FeedLine(name ,safe_position, photo_position, feed_position)
|
||
self.init_seting_frame()
|
||
self.updateUI_Select_Line()
|
||
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)
|
||
line_head = self.comboBox_lineIndex.currentData()
|
||
self.command_quene.put(FeedCommand(FeedingConfig(num, self.feedLine_dict[line_head])))
|
||
self.stackedWidget_num.setCurrentIndex(1)
|
||
self.set_run_status_button(True)
|
||
|
||
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()
|
||
self.lineEdit_num.show()
|
||
|
||
def send_subOneAsix_button_click(self):
|
||
btn_str = self.sender().objectName()
|
||
Constant.manual_adjust_accuracy = float(self.lineEdit_manual_adjust_accuracy.text())
|
||
x1 = self.horizontalSlider_J1.value()
|
||
x2 = self.horizontalSlider_J2.value()
|
||
x3 = self.horizontalSlider_J3.value()
|
||
x4 = self.horizontalSlider_J4.value()
|
||
x5 = self.horizontalSlider_J5.value()
|
||
x6 = self.horizontalSlider_J6.value()
|
||
if 'j1' in btn_str:
|
||
x1 = x1 - Constant.manual_adjust_accuracy
|
||
elif 'j2' in btn_str:
|
||
x2 = x2 - Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j3' in btn_str:
|
||
x3 = x3 - Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j4' in btn_str:
|
||
x4 = x4 - Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j5' in btn_str:
|
||
x5 = x5 - Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j6' in btn_str:
|
||
x6 = x6 - Constant.manual_adjust_accuracy
|
||
self.send_position_command(x1,x2,x3,x4,x5,x6,MoveType.AXIS)
|
||
|
||
|
||
def send_addOneAsix_button_click(self, btn):
|
||
btn_str = self.sender().objectName()
|
||
Constant.manual_adjust_accuracy = float(self.lineEdit_manual_adjust_accuracy.text())
|
||
x1 = self.horizontalSlider_J1.value()
|
||
x2 = self.horizontalSlider_J2.value()
|
||
x3 = self.horizontalSlider_J3.value()
|
||
x4 = self.horizontalSlider_J4.value()
|
||
x5 = self.horizontalSlider_J5.value()
|
||
x6 = self.horizontalSlider_J6.value()
|
||
if 'j1' in btn_str:
|
||
x1 = x1 + Constant.manual_adjust_accuracy
|
||
elif 'j2' in btn_str:
|
||
x2 = x2 + Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j3' in btn_str:
|
||
x3 = x3 + Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j4' in btn_str:
|
||
x4 = x4 + Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j5' in btn_str:
|
||
x5 = x5 + Constant.manual_adjust_accuracy
|
||
pass
|
||
elif 'j6' in btn_str:
|
||
x6 = x6 + Constant.manual_adjust_accuracy
|
||
self.send_position_command(x1, x2, x3, x4, x5, x6, move_type=MoveType.AXIS)
|
||
|
||
|
||
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,index):
|
||
#self.logger.info("This is an info message")
|
||
self.stackedWidget_feed.setCurrentIndex(index)
|
||
if index == 0:
|
||
self.updateUI_Select_Line()
|
||
|
||
|
||
|
||
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):
|
||
|
||
self.send_position_command(float(self.lineEdit_j1.text()),
|
||
float(self.lineEdit_j2.text()),
|
||
float(self.lineEdit_j3.text()),
|
||
float(self.lineEdit_j4.text()),
|
||
float(self.lineEdit_j5.text()),
|
||
float(self.lineEdit_j6.text()))
|
||
|
||
def send_setSpeed_label_doubelClick(self):
|
||
self.pushButton_speed.hide()
|
||
self.lineEdit_speed.show()
|
||
pass
|
||
def send_setSpeed_lineEdit_returePressed(self):
|
||
Constant.speed = float(self.lineEdit_speed.text())
|
||
self.lineEdit_speed.hide()
|
||
self.pushButton_speed.setText(str(Constant.speed))
|
||
self.pushButton_speed.show()
|
||
pass
|
||
|
||
|
||
def send_get_safe_position_button_click(self):
|
||
real_position = self.robotClient.status_model.getRealPosition()
|
||
row_i = self.tableWidget_feedSeting.currentRow()
|
||
head = self.tableWidget_feedSeting.item(row_i, 0).text()
|
||
self.feedLine_dict[head].safe_position.init_position(real_position.X,real_position.Y,real_position.Z,real_position.U,real_position.V,real_position.W)
|
||
self.set_position_to_tabel(row_i,0,real_position)
|
||
|
||
def send_get_photo_position_button_click(self):
|
||
real_position = self.robotClient.status_model.getRealPosition()
|
||
row_i = self.tableWidget_feedSeting.currentRow()
|
||
head = self.tableWidget_feedSeting.item(row_i, 0).text()
|
||
self.feedLine_dict[head].photo_position.init_position(real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W)
|
||
self.set_position_to_tabel(row_i, 1, real_position)
|
||
def send_get_feed_position_button_click(self):
|
||
real_position = self.robotClient.status_model.getRealPosition()
|
||
row_i = self.tableWidget_feedSeting.currentRow()
|
||
head = self.tableWidget_feedSeting.item(row_i, 0).text()
|
||
self.feedLine_dict[head].feed_position.init_position(real_position.X, real_position.Y, real_position.Z, real_position.U, real_position.V, real_position.W)
|
||
self.set_position_to_tabel(row_i, 2, real_position)
|
||
|
||
def send_tabelFeedSet_addRow(self):
|
||
for i in range(1,20):
|
||
head = f'{Constant.feedLine_set_section}{i}'
|
||
if head not in self.feedLine_dict:
|
||
row_position = self.tableWidget_feedSeting.rowCount() # 当前行数
|
||
self.tableWidget_feedSeting.insertRow(row_position)
|
||
safe_position = Real_Position()
|
||
photo_position = Real_Position()
|
||
feed_position = Real_Position()
|
||
self.feedLine_dict[head] = FeedLine('新建', safe_position, photo_position, feed_position)
|
||
self.tableWidget_feedSeting.setItem(self.tableWidget_feedSeting.rowCount() - 1, 0,
|
||
QTableWidgetItem(head))
|
||
self.tableWidget_feedSeting.setItem(self.tableWidget_feedSeting.rowCount() - 1, 1,
|
||
QTableWidgetItem('新建'))
|
||
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 0, safe_position)
|
||
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 1, photo_position)
|
||
self.set_position_to_tabel(self.tableWidget_feedSeting.rowCount() - 1, 2, feed_position)
|
||
break
|
||
|
||
def send_tabelFeedSet_delRow(self):
|
||
selectRow = self.tableWidget_feedSeting.currentRow()
|
||
if selectRow >= 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):
|
||
pass
|
||
# 清空状态
|
||
self.feeding.feedStatus = FeedStatus.FNone
|
||
# 清空运行命令
|
||
self.send_clear_auto_command()
|
||
#
|
||
|
||
|
||
def send_pauseFeed_button_click(self):
|
||
if self.pushButton_pauseFeed.text()=='暂停':
|
||
self.pushButton_pauseFeed.setText('继续')
|
||
self.send_pause_command(True)
|
||
else:
|
||
self.pushButton_pauseFeed.setText('暂停')
|
||
self.send_pause_command(False)
|
||
|
||
pass
|
||
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.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)
|
||
else:
|
||
self.set_run_status_button(False)
|
||
if self.feeding.feedStatus == FeedStatus.FNone:
|
||
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_Select_Line(self):
|
||
self.comboBox_lineIndex.clear()
|
||
for key,value in self.feedLine_dict.items():
|
||
self.comboBox_lineIndex.addItem(value.name,key)
|
||
|
||
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 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 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()
|
||
print(request_command)
|
||
log_str = f'清除自动指令'
|
||
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}'
|
||
self.logger_textEdit.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()
|
||
print(request_command)
|
||
log_str = f'暂停:{pause}'
|
||
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()
|
||
print(request_command)
|
||
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()
|
||
print(request_command)
|
||
log_str = f'切换工具'
|
||
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)
|
||
log_str = f'切换工具'
|
||
self.robotClient.add_sendQuene(request_command)
|
||
|
||
|
||
|
||
if __name__ == "__main__":
|
||
app = QApplication(sys.argv)
|
||
window = MainWindow()
|
||
window.show()
|
||
sys.exit(app.exec())
|