update 完成UI可视化界面生成

This commit is contained in:
FrankCV2048
2024-12-01 22:58:09 +08:00
parent e856bb0f0a
commit 157e7edce5
8 changed files with 607 additions and 165 deletions

345
main.py
View File

@ -10,14 +10,15 @@ import PySide6
from PyQt5.uic.properties import QtWidgets
from PySide6 import QtCore
from PySide6.QtCore import QThread, Signal, Slot, QObject, QEvent, QTimer
from PySide6.QtGui import QIntValidator, QStandardItemModel, QStandardItem, Qt, QMovie, QIcon
from PySide6.QtGui import QIntValidator, QStandardItemModel, QStandardItem, Qt, QMovie, QIcon, QCursor, QColor
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHeaderView, QTableWidget, \
QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox
QTableWidgetItem, QWidget, QHBoxLayout, QAbstractItemView, QMessageBox, QSizePolicy, QComboBox, QMenu
from datetime import datetime
from click import clear
import Util.util_pic
from Model.FeedModel import LineModel, PositionModel
from Util.util_ini import writeFeedLine_to_ini
import Constant
from CU.Command import FeedCommand
@ -49,13 +50,16 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.init_UI()
self.init_Run()
self.init_robot_info()
self.init_FeedLine()
self.init_IOPanel()
self.start_Runing()
self.init_log()
self.init_table_positions()
self.init_FeedLine()
self.init_table_lines()
self.init_table_position()
self.table_line_changed = False
self.table_position_changed = False
self.selected_line_section = ''
def init_IOPanel(self):
self.dirt_io_points = {}
@ -157,34 +161,262 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.widget_y32.clicked.connect(self.send_IO_Point_OpenOrClose)
self.widget_y32.index=32
# region 战线,点位表格初始化
def init_table_lines(self):
self.tableWidget_lines.setColumnCount(4)
def init_table_positions(self):
self.tableWidget_positions.setRowCount(9)
self.tableWidget_positions.setColumnCount(2)
self.tableWidget_positions.setHorizontalHeaderLabels(["名字", "删除点位"])
self.tableWidget_positions.setSelectionBehavior(QTableWidget.SelectRows)
self.tableWidget_positions.setAutoScroll(True)
self.tableWidget_lines.horizontalHeader().setStyleSheet(f"background-color: {QColor(44,44,44).name()};")
self.tableWidget_lines.verticalHeader().setStyleSheet(f"background-color: {QColor(44,44,44).name()};")
self.tableWidget_lines.verticalHeader().hide()
self.tableWidget_lines.setHorizontalHeaderLabels(["节名", "线名", "id", "操作"])
self.tableWidget_lines.setSelectionBehavior(QTableWidget.SelectRows)
self.tableWidget_lines.setAutoScroll(True)
self.tableWidget_lines. setColumnHidden(0,True)
self.tableWidget_lines. setColumnHidden(2,True)
# 自动调整列宽
header = self.tableWidget_positions.horizontalHeader()
# 让第一列宽度根据内容自动调整
header = self.tableWidget_lines.horizontalHeader()
header.setSectionResizeMode(0, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch)
# 第二列宽度根据内容自动调整
header.setSectionResizeMode(1, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch)
header.setSectionResizeMode(2, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch)
self.tableWidget_lines.setContextMenuPolicy(PySide6.QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
self.tableWidget_lines.customContextMenuRequested.connect(self.show_lines_context_menu)
self.tableWidget_lines.cellChanged.connect(self.send_table_lines_cell_changed)
self.init_table_lines_data()
for row in range(5):
combo = QComboBox()
combo.addItems(["位置 A", "位置 B", "位置 C"])
self.tableWidget_positions.setCellWidget(row, 0, combo)
self.pushButton_savePosition.clicked.connect(self.send_save_lines_data)
for row in range(5):
get_button = QPushButton("获取位置")
# get_button.clicked.connect(self.get_location)
self.tableWidget_positions.setCellWidget(row, 1, get_button)
def send_table_lines_cell_changed(self):
self.table_line_changed = True
def send_save_lines_data(self):
if self.table_position_changed or self.table_line_changed:
section = self.selected_line_section
for row_i in range(self.tableWidget_lines.rowCount()):
if self.tableWidget_lines.item(row_i, 0).text() == section:
line_model = LineModel()
line_model.section = section
line_model.name = self.tableWidget_lines.item(row_i, 1).text()
line_model.id = int(self.tableWidget_lines.item(row_i, 2).text())
line_model.positions = self.get_table_positions()
if len(self.get_table_positions()) != 0 and line_model.id != self.get_table_positions()[0].id:
return
if len(self.get_table_positions())==0:
return
config_reader = configparser.ConfigParser()
config_reader.read(Constant.feedLine_set_file, encoding='utf-8')
line_model.save_line_model(config_reader)
config_reader.write(open(Constant.feedLine_set_file, 'w', encoding='utf-8'))
break
self.init_FeedLine()
self.init_table_lines_data()
self.table_line_changed = False
self.table_position_changed = False
def get_table_positions(self):
position_models = []
for row_i in range(self.tableWidget_line_positions.rowCount()):
section = self.tableWidget_line_positions.item(row_i, 0).text()
position_model = PositionModel(index=row_i)
position_model.section = section
position_model.X = float(self.tableWidget_line_positions.item(row_i, 1).text())
position_model.Y = float(self.tableWidget_line_positions.item(row_i, 2).text())
position_model.Z = float(self.tableWidget_line_positions.item(row_i, 3).text())
position_model.U = float(self.tableWidget_line_positions.item(row_i, 4).text())
position_model.V = float(self.tableWidget_line_positions.item(row_i, 5).text())
position_model.W = float(self.tableWidget_line_positions.item(row_i, 6).text())
widget = self.tableWidget_line_positions.cellWidget(row_i, 7)
position_model.status = widget.currentData()
position_model.id = int(self.tableWidget_line_positions.item(row_i, 8).text())
position_model.order = row_i
position_model.lineId = int(self.tableWidget_line_positions.item(row_i, 10).text())
position_models.append(position_model)
return position_models
def init_table_lines_data(self):
# self.tableWidget_lines.setItem(0, 0, QTableWidgetItem("线1"))
# self.tableWidget_lines.setItem(1, 0, QTableWidgetItem("线2"))
# self.tableWidget_lines.setItem()
self.tableWidget_lines.setRowCount(0)
for key,value in self.feedLine_dict.items():
self.tableWidget_lines.insertRow(self.tableWidget_lines.rowCount())
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 0, QTableWidgetItem(key))
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 1, QTableWidgetItem(value.name))
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 2, QTableWidgetItem(value.id))
show_pos_btn = QPushButton("显示路径")
show_pos_btn.clicked.connect(
lambda _, index=self.tableWidget_lines.rowCount()-1: self.show_lines_pos_data(index))
self.tableWidget_lines.setCellWidget(self.tableWidget_lines.rowCount() - 1, 3, show_pos_btn)
self.tableWidget_line_positions.setRowCount(0)
self.selected_line_section = ''
def show_lines_context_menu(self):
menu = QMenu(self)
action_add = menu.addAction("添加投料线")
action_del = menu.addAction("删除投料线")
action = menu.exec(QCursor.pos())
if action == action_add:
self.add_new_line()
elif action == action_del:
self.del_line()
def del_line(self):
if self.tableWidget_lines.rowCount()==0:
return
if self.tableWidget_lines.currentRow()==-1:
return
self.tableWidget_lines.removeRow(self.tableWidget_lines.currentRow())
self.table_line_changed = True
def add_new_line(self):
add_section = f'{Constant.feedLine_set_section}{1}'
for i in range(1,Constant.MAX_Line_num):
if not self.feedLine_dict.get(f"{Constant.feedLine_set_section}{i}"):
add_section = f"{Constant.feedLine_set_section}{i}"
break
self.tableWidget_lines.insertRow(self.tableWidget_lines.rowCount())
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 0, QTableWidgetItem(add_section))
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 1, QTableWidgetItem("线" + str(self.tableWidget_lines.rowCount())))
self.tableWidget_lines.setItem(self.tableWidget_lines.rowCount()-1, 2, QTableWidgetItem(str(i)))
show_pos_btn = QPushButton("显示路径")
show_pos_btn.clicked.connect(lambda _, index=self.tableWidget_lines.rowCount()-1: self.show_lines_pos_data(index))
self.tableWidget_lines.setCellWidget(self.tableWidget_lines.rowCount()-1, 3,show_pos_btn)
self.table_position_changed = True
self.feedLine_dict[add_section] = LineModel(i)
def show_lines_pos_data(self,line_index):
if self.selected_line_section!='' and self.selected_line_section != self.tableWidget_lines.item(line_index,0).text():
if self.table_position_changed or self.table_line_changed:
msgBox = QMessageBox()
msgBox.setText("已修改的数据,是否保存?")
msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
result = msgBox.exec()
if result == QMessageBox.StandardButton.Ok:
self.send_save_lines_data()
else:
# 重新初始化·
self.init_table_lines_data()
line_name = self.tableWidget_lines.item(line_index,0).text()
line_model = self.feedLine_dict.get(line_name)
self.init_table_positions_data(line_model.positions)
self.selected_line_section = line_name
self.label_table_line_position_title.setText(line_model.name)
def init_table_position(self):
#self.tableWidget_line_positions.setRowCount(5)
self.tableWidget_line_positions.setColumnCount(12)
self.tableWidget_line_positions.setHorizontalHeaderLabels(["节段","X","Y","Z","U","V","W","类型","序号","排序","线号","操作2"])
self.tableWidget_line_positions.setSelectionBehavior(QTableWidget.SelectRows)
self.tableWidget_line_positions.setColumnHidden(0, True)
self.tableWidget_line_positions.setColumnHidden(8,True)
self.tableWidget_line_positions.setColumnHidden(9, True)
self.tableWidget_line_positions.setColumnHidden(10, True)
self.tableWidget_line_positions.setAutoScroll(True)
self.tableWidget_line_positions.verticalHeader().hide()
# 自动调整列宽
header = self.tableWidget_line_positions.horizontalHeader()
header.setSectionResizeMode(0, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch)
self.tableWidget_line_positions.setHorizontalScrollBarPolicy(PySide6.QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded)
for i in range(12):
header.setSectionResizeMode(i, PySide6.QtWidgets.QHeaderView.ResizeMode.Stretch)
self.tableWidget_line_positions.setContextMenuPolicy(PySide6.QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
self.tableWidget_line_positions.customContextMenuRequested.connect(self.show_positions_context_menu)
def init_table_positions_data(self,position_list):
for index,position_model in enumerate(position_list):
self.tableWidget_line_positions.insertRow(self.tableWidget_line_positions.rowCount())
self.set_positionModel_to_tabel(index,position_model)
def show_positions_context_menu(self):
menu = QMenu(self)
action_add = menu.addAction("添加位置节点")
action_del = menu.addAction("删除位置节点")
action = menu.exec(QCursor.pos())
if action == action_add:
self.add_new_position()
elif action == action_del:
self.del_position()
def del_position(self):
if self.tableWidget_line_positions.rowCount()==0:
return
if self.tableWidget_line_positions.currentRow()==-1:
return
self.tableWidget_line_positions.removeRow(self.tableWidget_line_positions.currentRow())
self.table_position_changed = True
def add_new_position(self):# 选中添加
config_reader = configparser.ConfigParser()
config_reader.read(Constant.feedLine_set_file, encoding = 'utf-8')
position_model = PositionModel(999)
for i in range(1,Constant.MAX_Position_num):
if not config_reader.has_section(f"{Constant.position_set_section}{i}"):
position_model = PositionModel(i)
break
if self.tableWidget_line_positions.currentRow()==-1:
row_i = self.tableWidget_line_positions.rowCount()
else:
row_i = self.tableWidget_line_positions.currentRow()
self.tableWidget_line_positions.insertRow(row_i)
position_model.order = 0
position_model.status = FeedStatus.FStart
line_model = self.feedLine_dict.get(self.selected_line_section)
line_id = line_model.id
position_model.lineId = line_id
self.set_positionModel_to_tabel(row_i,position_model)
self.table_line_changed = True
def tabel_get_position(self,row_i):
self.set_position_to_tabel(row_i,self.status_address.getRealPosition())
self.table_line_changed = True
def tabel_delete_position(self,row_i):
self.tableWidget_line_positions.removeRow(row_i)
self.table_line_changed = True
def set_positionModel_to_tabel(self,row_i,position_model:PositionModel):
self.tableWidget_line_positions.setItem(row_i,0,QTableWidgetItem(str(position_model.section)))
self.set_position_tabel(row_i,position_model.get_position())
combox = QComboBox()
combox.addItem("初始化点", 1)
combox.addItem("中间点", 3)
combox.addItem("相机/待抓点",4)
combox.addItem("抓取",5)
combox.addItem("破带点1",6)
combox.addItem("破带点2",7)
combox.addItem("震动点",8)
combox.addItem("扔带点",9)
combox.setCurrentIndex(position_model.status)
combox.currentIndexChanged.connect(self.send_table_position_status_changed)
self.tableWidget_line_positions.setCellWidget(row_i, 7, combox)
#self.tableWidget_line_positions.setItem(row_i, 7, QTableWidgetItem(str(position_model.status)))
self.tableWidget_line_positions.setItem(row_i, 8, QTableWidgetItem(str(position_model.id)))
self.tableWidget_line_positions.setItem(row_i, 9, QTableWidgetItem(str(position_model.order)))
self.tableWidget_line_positions.setItem(row_i, 10, QTableWidgetItem(str(position_model.lineId)))
get_pos_btn = QPushButton("获取点位")
get_pos_btn.clicked.connect(
lambda _, index=row_i: self.tabel_get_position(index))
self.tableWidget_line_positions.setCellWidget(row_i, 11, get_pos_btn)
# del_pos_btn = QPushButton("删除点位")
# del_pos_btn.clicked.connect(lambda _, index=row_i: self.tabel_delete_position(index))
# self.tableWidget_line_positions.setCellWidget(row_i, 12, del_pos_btn)
def send_table_position_status_changed(self):
self.table_position_changed = True
def set_position_tabel(self, row_i, position):
self.tableWidget_line_positions.setItem(row_i, 1, QTableWidgetItem(str(position.X)))
self.tableWidget_line_positions.setItem(row_i, 2, QTableWidgetItem(str(position.Y)))
self.tableWidget_line_positions.setItem(row_i, 3, QTableWidgetItem(str(position.Z)))
self.tableWidget_line_positions.setItem(row_i, 4, QTableWidgetItem(str(position.U)))
self.tableWidget_line_positions.setItem(row_i, 5, QTableWidgetItem(str(position.V)))
self.tableWidget_line_positions.setItem(row_i, 6, QTableWidgetItem(str(position.W)))
#endregion
def init_qss(self):
pass
@ -277,13 +509,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def init_Run(self):
self.robotClient = None
self.configReader = configparser.ConfigParser()
self.detection = Detection()
self.detection = None # Detection() #TODO 关闭图像
self.command_position_quene = Queue()
self.status_address = DataAddress()
self.feedLine_dict = {}
self.command_quene = Queue()
self.main_threading = None
self.detection_person = DetectionPerson()
self.detection_person = None #DetectionPerson()
self.configReader.read(Constant.set_ini)
ip = self.configReader.get('Robot_Feed', 'IPAddress')
@ -438,57 +670,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.pushButton_tableFeedSet_save.clicked.connect(self.send_tabelFeedSet_save)
def init_FeedLine(self):
line_count = self.configReader.get('Robot_Feed', 'LineCount', fallback=0)
# 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()
broken_position1 = Real_Position()
broken_position2 = Real_Position()
shake_position = Real_Position()
dropBag_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))
broken_position1.X = float(self.configReader.get(line_str, 'BrokenPosition_x', fallback=0))
broken_position1.Y = float(self.configReader.get(line_str, 'BrokenPosition_y', fallback=0))
broken_position1.Z = float(self.configReader.get(line_str, 'BrokenPosition_z', fallback=0))
broken_position1.U = float(self.configReader.get(line_str, 'BrokenPosition_u', fallback=0))
broken_position1.V = float(self.configReader.get(line_str, 'BrokenPosition_v', fallback=0))
broken_position1.W = float(self.configReader.get(line_str, 'BrokenPosition_w', fallback=0))
broken_position2.X = float(self.configReader.get(line_str, 'BrokenPosition2_x', fallback=0))
broken_position2.Y = float(self.configReader.get(line_str, 'BrokenPosition2_y', fallback=0))
broken_position2.Z = float(self.configReader.get(line_str, 'BrokenPosition2_z', fallback=0))
broken_position2.U = float(self.configReader.get(line_str, 'BrokenPosition2_u', fallback=0))
broken_position2.V = float(self.configReader.get(line_str, 'BrokenPosition2_v', fallback=0))
broken_position2.W = float(self.configReader.get(line_str, 'BrokenPosition2_w', fallback=0))
shake_position.X = float(self.configReader.get(line_str, 'ShakePosition_x', fallback=0))
shake_position.Y = float(self.configReader.get(line_str, 'ShakePosition_y', fallback=0))
shake_position.Z = float(self.configReader.get(line_str, 'ShakePosition_z', fallback=0))
shake_position.U = float(self.configReader.get(line_str, 'ShakePosition_u', fallback=0))
shake_position.V = float(self.configReader.get(line_str, 'ShakePosition_v', fallback=0))
shake_position.W = float(self.configReader.get(line_str, 'ShakePosition_w', fallback=0))
dropBag_position.X = float(self.configReader.get(line_str, 'DropBagPosition_x', fallback=0))
dropBag_position.Y = float(self.configReader.get(line_str, 'DropBagPosition_y', fallback=0))
dropBag_position.Z = float(self.configReader.get(line_str, 'DropBagPosition_z', fallback=0))
dropBag_position.U = float(self.configReader.get(line_str, 'DropBagPosition_u', fallback=0))
dropBag_position.V = float(self.configReader.get(line_str, 'DropBagPosition_v', fallback=0))
dropBag_position.W = float(self.configReader.get(line_str, 'DropBagPosition_w', fallback=0))
name = self.configReader.get(line_str, 'Name', fallback='未命名')
self.feedLine_dict[f'{Constant.feedLine_set_section}{i + 1}'] = FeedLine(i+1,name, safe_position,
broken_position1,broken_position2,shake_position ,dropBag_position)
self.init_seting_frame()
for i in range(1,Constant.MAX_Line_num):
line_str = f'{Constant.feedLine_set_section}{i}'
if self.configReader.has_section(line_str):
feed_line = LineModel()
feed_line.read_line_model(config_reader=self.configReader,index=i)
self.feedLine_dict[f'{Constant.feedLine_set_section}{i}'] = feed_line
self.updateUI_Select_Line()
pass