213 lines
8.4 KiB
Python
213 lines
8.4 KiB
Python
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
import logging
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
# 导入PySide6
|
|||
|
|
from PySide6.QtWidgets import QWidget, QMessageBox, QTableWidgetItem, QStackedWidget, QLabel
|
|||
|
|
from PySide6.QtCore import Qt, QTimer
|
|||
|
|
from PySide6.QtGui import QBrush, QColor
|
|||
|
|
|
|||
|
|
# 导入UI
|
|||
|
|
from ui.main_window_ui import MainWindowUI
|
|||
|
|
|
|||
|
|
# 导入相机显示组件和设置组件
|
|||
|
|
from widgets.camera_display_widget import CameraDisplayWidget
|
|||
|
|
from widgets.camera_settings_widget import CameraSettingsWidget
|
|||
|
|
|
|||
|
|
|
|||
|
|
class MainWindow(MainWindowUI):
|
|||
|
|
"""主窗口"""
|
|||
|
|
|
|||
|
|
def __init__(self, user_id=None, user_name=None, corp_name=None, corp_id=None, position_id=None):
|
|||
|
|
super().__init__()
|
|||
|
|
self.user_id = user_id
|
|||
|
|
self.user_name = user_name
|
|||
|
|
self.corp_name = corp_name
|
|||
|
|
self.corp_id = corp_id
|
|||
|
|
self.position_id = position_id
|
|||
|
|
|
|||
|
|
# 设置窗口标题
|
|||
|
|
if user_name and corp_name:
|
|||
|
|
self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})")
|
|||
|
|
|
|||
|
|
|
|||
|
|
# # 创建相机显示组件并添加到上料区
|
|||
|
|
# self.camera_display = CameraDisplayWidget()
|
|||
|
|
# self.material_content_layout.addWidget(self.camera_display)
|
|||
|
|
|
|||
|
|
# 为下料区添加占位标签,确保它保持为空
|
|||
|
|
self.output_placeholder = QLabel("下料区 - 暂无内容")
|
|||
|
|
self.output_placeholder.setAlignment(Qt.AlignCenter)
|
|||
|
|
self.output_placeholder.setStyleSheet("color: #888888; background-color: #f0f0f0;")
|
|||
|
|
self.output_content_layout.addWidget(self.output_placeholder)
|
|||
|
|
|
|||
|
|
# 创建堆叠部件
|
|||
|
|
self.stacked_widget = QStackedWidget()
|
|||
|
|
self.stacked_widget.addWidget(self.central_widget) # 主页面
|
|||
|
|
|
|||
|
|
# 不在这里直接初始化相机设置组件
|
|||
|
|
# 延迟创建,保证创建的时候SettingsUI的所有控件都已经准备好
|
|||
|
|
self.camera_settings = None
|
|||
|
|
|
|||
|
|
# 设置中央部件为堆叠部件
|
|||
|
|
self.setCentralWidget(self.stacked_widget)
|
|||
|
|
|
|||
|
|
# 连接信号和槽
|
|||
|
|
# self.connect_signals()
|
|||
|
|
|
|||
|
|
# 默认显示主页面
|
|||
|
|
self.stacked_widget.setCurrentIndex(0)
|
|||
|
|
|
|||
|
|
# 初始化数据
|
|||
|
|
self.initialize_data()
|
|||
|
|
|
|||
|
|
# 配置检验列为5列
|
|||
|
|
self.set_inspection_columns(5)
|
|||
|
|
|
|||
|
|
logging.info(f"主窗口已创建,用户: {user_name}")
|
|||
|
|
|
|||
|
|
def connect_signals(self):
|
|||
|
|
# 连接菜单动作
|
|||
|
|
self.main_action.triggered.connect(self.show_main_page)
|
|||
|
|
self.settings_action.triggered.connect(self.show_settings_page)
|
|||
|
|
|
|||
|
|
# 连接按钮事件
|
|||
|
|
self.input_button.clicked.connect(self.handle_input)
|
|||
|
|
self.output_button.clicked.connect(self.handle_output)
|
|||
|
|
self.start_button.clicked.connect(self.handle_start)
|
|||
|
|
self.stop_button.clicked.connect(self.handle_stop)
|
|||
|
|
|
|||
|
|
# 连接相机显示组件信号
|
|||
|
|
self.camera_display.signal_camera_status.connect(self.handle_camera_status)
|
|||
|
|
|
|||
|
|
def initialize_data(self):
|
|||
|
|
"""初始化界面数据"""
|
|||
|
|
# 设置订单和批号
|
|||
|
|
self.order_edit.setText("ORD-2025-001")
|
|||
|
|
self.tray_edit.setText("BAT-2025-001")
|
|||
|
|
|
|||
|
|
# 初始化项目表格数据示例
|
|||
|
|
project_data = [
|
|||
|
|
["100", "50", "200", "95%"],
|
|||
|
|
["3000", "1500", "6000", "92%"],
|
|||
|
|
["36000", "18000", "72000", "90%"],
|
|||
|
|
["120000", "60000", "240000", "91%"]
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
for row in range(4):
|
|||
|
|
for col in range(1, 5): # 从第2列开始(跳过项目列)
|
|||
|
|
item = QTableWidgetItem(project_data[row][col-1])
|
|||
|
|
# item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐
|
|||
|
|
self.project_table.setItem(row, col, item)
|
|||
|
|
|
|||
|
|
# 初始化任务表格数据示例 - 注意:现在表格有3行,第0行是一级标题,第1行是二级标题,第2行是数据行
|
|||
|
|
# 数据应该填充在第2行(索引为2)
|
|||
|
|
data = ["200", "95", "0", "0"] # 分别对应:总生产数量、总生产公斤、已完成数量、已完成公斤
|
|||
|
|
for col, value in enumerate(data):
|
|||
|
|
item = QTableWidgetItem(value)
|
|||
|
|
item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐
|
|||
|
|
self.task_table.setItem(2, col, item)
|
|||
|
|
|
|||
|
|
def show_main_page(self):
|
|||
|
|
self.stacked_widget.setCurrentWidget(self.central_widget)
|
|||
|
|
|
|||
|
|
# 如果相机已连接,直接开始显示相机画面
|
|||
|
|
if self.camera_display.camera_manager.isOpen:
|
|||
|
|
if not self.camera_display.camera_manager.isGrabbing:
|
|||
|
|
self.camera_display.start_display()
|
|||
|
|
|
|||
|
|
logging.info("显示主页面")
|
|||
|
|
|
|||
|
|
def show_settings_page(self):
|
|||
|
|
# 延迟创建相机设置组件
|
|||
|
|
if self.camera_settings is None:
|
|||
|
|
self.camera_settings = CameraSettingsWidget()
|
|||
|
|
# 连接相机设置信号
|
|||
|
|
self.camera_settings.signal_camera_connection.connect(self.handle_camera_connection)
|
|||
|
|
self.camera_settings.signal_camera_params_changed.connect(self.handle_camera_params_changed)
|
|||
|
|
self.camera_settings.signal_camera_error.connect(self.handle_camera_error)
|
|||
|
|
# 添加到堆叠部件
|
|||
|
|
self.stacked_widget.addWidget(self.camera_settings)
|
|||
|
|
|
|||
|
|
# 切换到设置页面
|
|||
|
|
self.stacked_widget.setCurrentWidget(self.camera_settings)
|
|||
|
|
logging.info("显示设置页面")
|
|||
|
|
|
|||
|
|
def handle_input(self):
|
|||
|
|
"""处理上料按钮点击事件"""
|
|||
|
|
logging.info("上料按钮被点击")
|
|||
|
|
|
|||
|
|
# 如果相机已经配置,则开始显示
|
|||
|
|
if self.camera_display.camera_manager.isOpen and not self.camera_display.camera_manager.isGrabbing:
|
|||
|
|
self.camera_display.start_display()
|
|||
|
|
|
|||
|
|
QMessageBox.information(self, "操作提示", "开始上料操作")
|
|||
|
|
# 这里添加上料相关的业务逻辑
|
|||
|
|
|
|||
|
|
def handle_output(self):
|
|||
|
|
"""处理下料按钮点击事件"""
|
|||
|
|
logging.info("下料按钮被点击")
|
|||
|
|
QMessageBox.information(self, "操作提示", "开始下料操作")
|
|||
|
|
# 这里添加下料相关的业务逻辑
|
|||
|
|
|
|||
|
|
def handle_start(self):
|
|||
|
|
"""处理开始按钮点击事件"""
|
|||
|
|
logging.info("开始按钮被点击")
|
|||
|
|
|
|||
|
|
# 开始显示相机画面
|
|||
|
|
if self.camera_display.camera_manager.isOpen:
|
|||
|
|
self.camera_display.start_display()
|
|||
|
|
|
|||
|
|
QMessageBox.information(self, "操作提示", "生产线已启动")
|
|||
|
|
# 这里添加启动生产线的业务逻辑
|
|||
|
|
|
|||
|
|
def handle_stop(self):
|
|||
|
|
"""处理暂停按钮点击事件"""
|
|||
|
|
logging.info("暂停按钮被点击")
|
|||
|
|
|
|||
|
|
# 停止显示相机画面
|
|||
|
|
self.camera_display.stop_display()
|
|||
|
|
|
|||
|
|
QMessageBox.information(self, "操作提示", "生产线已暂停")
|
|||
|
|
# 这里添加暂停生产线的业务逻辑
|
|||
|
|
|
|||
|
|
def handle_camera_status(self, is_connected, message):
|
|||
|
|
"""处理相机状态变化"""
|
|||
|
|
if is_connected:
|
|||
|
|
logging.info("相机已连接并显示")
|
|||
|
|
else:
|
|||
|
|
logging.warning(f"相机显示问题: {message}")
|
|||
|
|
|
|||
|
|
def handle_camera_connection(self, is_connected, message):
|
|||
|
|
"""处理相机连接状态变化"""
|
|||
|
|
if is_connected:
|
|||
|
|
logging.info("相机已连接")
|
|||
|
|
# 如果当前在主页面,直接开始显示相机画面
|
|||
|
|
if self.stacked_widget.currentWidget() == self.central_widget:
|
|||
|
|
self.camera_display.start_display()
|
|||
|
|
else:
|
|||
|
|
if message:
|
|||
|
|
logging.warning(f"相机连接失败: {message}")
|
|||
|
|
else:
|
|||
|
|
logging.info("相机已断开")
|
|||
|
|
# 如果相机断开,确保停止显示
|
|||
|
|
self.camera_display.stop_display()
|
|||
|
|
|
|||
|
|
def handle_camera_params_changed(self, exposure_time, gain, frame_rate):
|
|||
|
|
"""处理相机参数变化"""
|
|||
|
|
logging.info(f"相机参数已更新: 曝光={exposure_time:.1f}μs, 增益={gain:.1f}dB, 帧率={frame_rate:.1f}fps")
|
|||
|
|
# 这里可以添加对相机参数变化的处理逻辑
|
|||
|
|
|
|||
|
|
def handle_camera_error(self, error_msg):
|
|||
|
|
"""处理相机错误"""
|
|||
|
|
logging.error(f"相机错误: {error_msg}")
|
|||
|
|
QMessageBox.warning(self, "相机错误", error_msg)
|
|||
|
|
|
|||
|
|
def closeEvent(self, event):
|
|||
|
|
"""窗口关闭事件"""
|
|||
|
|
# 停止相机显示
|
|||
|
|
self.camera_display.stop_display()
|
|||
|
|
|
|||
|
|
# 接受关闭事件
|
|||
|
|
event.accept()
|